Kour.io Vortex Menu

Invisibility, ESP, Aimbot

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         Kour.io Vortex Menu
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB...
// @match        *://kour.io/*
// @author       Vortex
// @description  Invisibility, ESP, Aimbot
// @run-at       document-start
// @grant        unsafeWindow
// @version 1.0
// @namespace https://greasyfork.org/users/1572944
// ==/UserScript==

(function () {
    ("use strict");

    /***************************************
     * Performance.now Wrapper (Speedhack deaktiviert)
     ***************************************/
    const originalPerfNow = performance.now.bind(performance);
    function updatePerformanceNow() {
        performance.now = originalPerfNow;
    }
    updatePerformanceNow();

    /***************************************
     * Invisibility + Instakill
     ***************************************/
    const Signatures = {
        damageTaken: "f3 04 c8 02 f5 15 04",
        updateState: "f3 02 fd 02 f4 03 c8",
    };

    function hexOf(buf) {
        return Array.from(new Uint8Array(buf))
            .map((b) => b.toString(16).padStart(2, "0"))
            .join(" ");
    }

    function shouldBlockDamage(ev) {
        return (
            ev.data instanceof ArrayBuffer &&
            hexOf(ev.data).startsWith(Signatures.damageTaken) &&
            kourInstance.config.Invisible
        );
    }

    /***************************************
     * AntiAim
     ***************************************/
    const HEADER_SIG = [0xf3, 0x02, 0xfd, 0x02, 0xf4, 0x03];
    const SAFE_MIN_LENGTH = 70;

    function arrayStartsWith(arr, prefix) {
        if (arr.length < prefix.length) return false;
        for (let i = 0; i < prefix.length; i++) {
            if (arr[i] !== prefix[i]) return false;
        }
        return true;
    }

    function isSafeToModify(packet) {
        return packet.byteLength >= SAFE_MIN_LENGTH && !kourInstance.config.Invisible && kourInstance.config.AntiAim;
    }

    function modifyPacket(packet) {
        const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);

        let x = view.getFloat32(28, true);
        const xDelta = Math.random() < 0.5 ? -0.2 : 0.2;
        x += xDelta;
        view.setFloat32(28, x, true);

        let z = view.getFloat32(36, true);
        const zDelta = Math.random() < 0.5 ? -0.2 : 0.2;
        z += zDelta;
        view.setFloat32(36, z, true);

        return packet;
    }

    /***************************************
     * Spinbot Angle Modifier
     ***************************************/
    const crazyNumbers = [
        3822588238527201280.00, -1857736430059520.00, 0.00, -0.00, -1.4284511533486216e+24,
        -0.00, 0.00, 0.12, -1.8763868419170566e+22, 0.00, 556457979374085341184.00, 0.00,
        -228963383699832832.00, -0.00, 478289722746077184.00, 0.00, -1707527.88, 0.00,
        2.0849836473005435e+26, -0.00, 343366451878428672.00, -0.00, 0.00, -0.00, -398.99,
        -7.327271464138011e+37, -0.00, 7.479676797675635e+34, 6077727.50, -112678365030856523776.00,
        64406255347955662848.00, -0.00, 3.9367609144474995e+28, -0.68, -4.1272324222675643e+34,
        0.00, -34401746419712.00, 256284.98, -0.00, -992099.94, -46124.25, -0.00, -0.23,
        3573135.75, -0.00, 3.4937574108676156e+24, 31446140.00, -0.00, 0.00,
        -2.633920784508417e+22, 1.5002101046880594e+23, -662611.81, 0.00, -7.82,
        2.1554711763577515e+33, -4781238408011841536.00, -8.267893275317273e+33, -0.00, 0.00,
        -4.7050078084659084e+24, 63447551577279168512.00, 0.00, 5.614778816753592e+36, 5183327.50,
    ];

    let currentIndex = 0;
    const ANGLE_OFFSET = 0x38;

    /***************************************
     * WebSocket Hooking
     ***************************************/
    (function hookWS() {
        const OrigWS = unsafeWindow.WebSocket;
        unsafeWindow.WebSocket = function (...args) {
            const ws = new OrigWS(...args);

            const { addEventListener } = ws;
            ws.addEventListener = (type, fn, opts) =>
                addEventListener.call(
                    ws,
                    type,
                    type === "message" ? (ev) => shouldBlockDamage(ev) || fn(ev) : fn,
                    opts
                );

            const protoDesc = Object.getOwnPropertyDescriptor(OrigWS.prototype, "onmessage");
            Object.defineProperty(ws, "onmessage", {
                set(fn) {
                    protoDesc.set.call(this, (ev) => shouldBlockDamage(ev) || fn(ev));
                },
                get() {
                    return protoDesc.get.call(this);
                },
            });

            const originalSend = ws.send;
            ws.send = function (data) {
                if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
                    let packet = data instanceof Uint8Array ? data : new Uint8Array(data);

                    const hex = hexOf(packet);

                    if (hex.startsWith(Signatures.updateState) && kourInstance.config.Instakill) {
                        for (let i = 0; i < 41; i++) originalSend.call(ws, data);
                        return;
                    }

                    if (arrayStartsWith(packet, HEADER_SIG)) {
                        if (isSafeToModify(packet)) {
                            packet = modifyPacket(packet);
                            data = packet.buffer;
                        }

                        if (kourInstance.config.SpinBot && packet.byteLength >= ANGLE_OFFSET + 4 && !kourInstance.config.Invisible) {
                            const view = new DataView(data);
                            const num = crazyNumbers[currentIndex];

                            view.setFloat32(ANGLE_OFFSET, num, true);

                            currentIndex++;
                            if (currentIndex >= crazyNumbers.length) currentIndex = 0;
                        }
                    }
                }

                return originalSend.call(this, data);
            };

            return ws;
        };

        unsafeWindow.WebSocket.prototype = OrigWS.prototype;
    })();

    /***************************************
     * Config Object
     ***************************************/
    class Kour {
        constructor() {
            this.config = {
                Invisible: true,
                Instakill: false,
                AntiAim: false,
                SpinBot: false,
                airStrafing: true,
            };
        }
    }

    const kourInstance = new Kour();
    unsafeWindow.kourInstance = kourInstance;

    /***************************************
     * Skin Changer (Lobby Only!)
     ***************************************/
    const skins = [
        { name: "KBI Agent", id: "12" },
        { name: "James Kour", id: "13" },
        { name: "President", id: "14" },
        { name: "Doctor", id: "15" },
        { name: "Trickster", id: "16" },
        { name: "Royal Guard", id: "17" },
        { name: "Xmas", id: "18" },
        { name: "Kelvis", id: "19" },
        { name: "Princess Pink", id: "20" },
        { name: "Princess White", id: "21" },
        { name: "Princess Bee", id: "22" },
        { name: "Princess Leaf", id: "23" },
        { name: "Koura Kraft", id: "24" },
        { name: "Green Hologram", id: "25" },
        { name: "Hologrape", id: "26" },
        { name: "Peter", id: "27" },
        { name: "Chicken", id: "28" },
        { name: "Chickoletta", id: "29" },
        { name: "Kyle", id: "30" },
        { name: "Shadowgram", id: "32" },
        { name: "IceBunny", id: "33" },
        { name: "CocoBunny", id: "34" },
        { name: "Kourean", id: "35" },
        { name: "KourG", id: "36" },
        { name: "Hackour", id: "37" },
        { name: "Golden Hackour", id: "38" },
        { name: "Gas Man", id: "39" },
        { name: "Terrorist", id: "40" },
        { name: "Counter Terrorist", id: "41" },
        { name: "Ambush", id: "42" },
        { name: "Baby Kour", id: "43" },
        { name: "Poacher", id: "44" },
        { name: "Astronaut", id: "45" },
        { name: "Kour Parrot", id: "46" },
        { name: "Kour Pirate", id: "47" },
        { name: "Legionaut", id: "48" },
        { name: "Blue Hologram", id: "49" },
        { name: "Mr Wireframe", id: "50" },
        { name: "Mythian", id: "51" },
        { name: "Kour Trooper", id: "52" },
        { name: "Kour Craft", id: "53" },
        { name: "Kour Green Soldier", id: "54" },
        { name: "Yellow Astronaut", id: "55" },
        { name: "Orange Astronaut", id: "56" },
        { name: "Red Astronaut", id: "57" },
        { name: "Blue Astronaut", id: "58" },
        { name: "Kour Banana", id: "59" },
        { name: "Mrs Kour", id: "60" },
        { name: "Investor Inverted", id: "61" },
        { name: "Kour Jungler", id: "62" },
        { name: "Skinny Baby", id: "63" },
        { name: "KourTuber", id: "64" },
        { name: "Red Hologram", id: "65" },
        { name: "White Hologram", id: "66" },
        { name: "Orange Hologram", id: "67" },
        { name: "Dark Blue Hologram", id: "68" },
        { name: "Brown Hologram", id: "69" },
        { name: "Yellow Hologram", id: "70" },
        { name: "Dark Red Hologram", id: "71" },
        { name: "Kourist", id: "72" },
        { name: "Firefighter", id: "73" },
        { name: "FireKour", id: "74" },
        { name: "Kour Thief", id: "75" },
        { name: "Kour Burger", id: "76" },
        { name: "Kour Fan", id: "77" },
        { name: "Kour Brady", id: "78" },
        { name: "LeKour James", id: "79" },
        { name: "Uncle Kour", id: "80" },
        { name: "Chef", id: "81" },
        { name: "KourObby", id: "82" },
        { name: "Legionary", id: "83" },
        { name: "Kitty Kour One", id: "84" },
        { name: "Kitty Kour Two", id: "85" },
        { name: "Kitty Kour Three", id: "86" },
        { name: "Kour Crafter", id: "87" },
        { name: "RTX", id: "88" },
        { name: "Loony Kour", id: "89" },
        { name: "Kour Shocker", id: "90" },
        { name: "Kourkin", id: "91" },
        { name: "Forest Kour", id: "92" },
        { name: "Slender Kour", id: "93" },
        { name: "Drakour", id: "94" },
        { name: "Christmas2024", id: "95" },
        { name: "Deer2024", id: "96" }
    ];

    function setSkin(skinID) {
        firebase
            .database()
            .ref("users/" + firebase.auth().currentUser.uid)
            .child("skin")
            .set(skinID);
        showUserDetails(
            firebase.auth().currentUser.email,
            firebase.auth().currentUser
        );
    }

    /***************************************
     * Profile Stats
     ***************************************/
    function setStat(stat, value) {
        const parsedValue = parseInt(value, 10);
        const finalValue = isNaN(parsedValue) ? value : parsedValue;
        firebase
            .database()
            .ref("users/" + firebase.auth().currentUser.uid + "/public")
            .child(stat)
            .set(finalValue);
        showUserDetails(
            firebase.auth().currentUser.email,
            firebase.auth().currentUser
        );
    }

    /***************************************
     * Clan Editing
     ***************************************/
    function overrideCreateClan() {
        if (typeof createClan === 'function') {
            createClan = function (clanName, leaderUserId, clanColor, reqID) {
                unityInstanceWrapper.sendMessage(firebaseObjName, 'OnSetDataNew', clanName + "&" + reqID);
            };
        } else {
            setTimeout(overrideCreateClan, 500);
        }
    }
    overrideCreateClan();

    /***************************************
     * Class Kills
     ***************************************/
    const classMapKills = {
        Soldier: "class0kills",
        Hitman: "class1kills",
        Gunner: "class2kills",
        Heavy: "class3kills",
        Rocketeer: "class4kills",
        Agent: "class5kills",
        Brawler: "class6kills",
        Investor: "class7kills",
        Assassin: "class8kills",
        Juggernaut: "class9kills",
        Recon: "class10kills",
        Pyro: "class11kills",
        Rayblader: "class15kills",
    };

    function setClassKills() {
        const existingDialog = document.getElementById("classSelectionDialog");
        if (existingDialog) existingDialog.remove();

        const dlg = document.createElement("div");
        dlg.id = "classSelectionDialog";
        Object.assign(dlg.style, {
            position: "fixed",
            top: "50%",
            left: "50%",
            transform: "translate(-50%, -50%)",
            background: "radial-gradient(circle at top, #13152a 0%, #050712 70%)",
            color: "#f3f3ff",
            padding: "18px",
            zIndex: "10002",
            fontFamily: "Segoe UI, Arial, sans-serif",
            fontSize: "13px",
            borderRadius: "12px",
            boxShadow: "0 0 20px rgba(0,0,0,0.75)",
            width: "320px",
            maxHeight: "420px",
            overflowY: "auto",
            border: "1px solid rgba(0,255,200,0.45)",
        });

        const title = document.createElement("div");
        title.textContent = "Class Kills bearbeiten";
        Object.assign(title.style, {
            fontWeight: "bold",
            fontSize: "16px",
            marginBottom: "10px",
            textAlign: "center",
            color: "#00ffd5",
        });
        dlg.appendChild(title);

        const grid = document.createElement("div");
        Object.assign(grid.style, {
            display: "grid",
            gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
            gap: "6px",
        });

        Object.keys(classMapKills).forEach((className) => {
            const btn = document.createElement("button");
            btn.textContent = className;
            Object.assign(btn.style, {
                padding: "7px 6px",
                cursor: "pointer",
                background: "linear-gradient(135deg, #15172b, #1f2240)",
                border: "1px solid rgba(0,255,200,0.3)",
                borderRadius: "6px",
                fontSize: "12px",
                color: "#e9e9ff",
                transition: "all 0.18s",
                textAlign: "center",
            });

            btn.addEventListener("mouseover", () => {
                btn.style.background = "linear-gradient(135deg, #202542, #2c3253)";
                btn.style.boxShadow = "0 0 6px rgba(0,255,200,0.35)";
                btn.style.transform = "translateY(-1px)";
            });
            btn.addEventListener("mouseout", () => {
                btn.style.background = "linear-gradient(135deg, #15172b, #1f2240)";
                btn.style.boxShadow = "none";
                btn.style.transform = "translateY(0)";
            });

            btn.addEventListener("click", () => {
                const killsValue = prompt(
                    `Neue Kill-Anzahl für ${className} eingeben:`,
                    "10000"
                );
                if (killsValue === null) return;
                const numKills = Number(killsValue);
                if (isNaN(numKills)) {
                    alert("Bitte eine gültige Zahl eingeben!");
                    return;
                }
                const dbField = classMapKills[className];
                updateClassKills(dbField, numKills);
                dlg.remove();
            });

            grid.appendChild(btn);
        });

        dlg.appendChild(grid);

        const closeBtn = document.createElement("button");
        closeBtn.textContent = "Schließen";
        Object.assign(closeBtn.style, {
            width: "100%",
            marginTop: "12px",
            padding: "7px",
            cursor: "pointer",
            background: "linear-gradient(135deg, #3b1f32, #52213d)",
            border: "1px solid rgba(255,80,120,0.5)",
            borderRadius: "6px",
            color: "#ffe6f0",
            transition: "all 0.18s",
        });
        closeBtn.addEventListener("mouseover", () => {
            closeBtn.style.background = "linear-gradient(135deg, #5a2544, #7a294f)";
        });
        closeBtn.addEventListener("mouseout", () => {
            closeBtn.style.background = "linear-gradient(135deg, #3b1f32, #52213d)";
        });
        closeBtn.addEventListener("click", () => dlg.remove());
        dlg.appendChild(closeBtn);

        document.body.appendChild(dlg);
    }

    function updateClassKills(classField, killCount) {
        if (!firebase.auth().currentUser) {
            console.log("[Vortex Menu] User ist nicht eingeloggt");
            return;
        }

        const updateData = {};
        updateData[classField] = killCount;

        firebase
            .database()
            .ref(`users/${firebase.auth().currentUser.uid}`)
            .update(updateData)
            .then(() => {
                showUserDetails(
                    firebase.auth().currentUser.email,
                    firebase.auth().currentUser
                );
                console.log(
                    `[Vortex Menu] ${classField} erfolgreich auf ${killCount} gesetzt`
                );
            })
            .catch((err) => {
                console.error(`[Vortex Menu] Fehler beim Updaten von ${classField}:`, err);
            });
    }

    /***************************************
     * Stats Changer
     ***************************************/
    function updateKDStats(kills) {
        if (!firebase.auth().currentUser) {
            console.log("[Vortex Menu] User ist nicht eingeloggt");
            alert("Bitte zuerst einloggen!");
            return;
        }

        const updateData = { totalKills: kills };

        firebase
            .database()
            .ref(`users/${firebase.auth().currentUser.uid}`)
            .update(updateData)
            .then(() => {
                showUserDetails(
                    firebase.auth().currentUser.email,
                    firebase.auth().currentUser
                );
                console.log(
                    `[Vortex Menu] Stats aktualisiert: Kills=${kills}`
                );
            })
            .catch((err) => {
                console.error("[Vortex Menu] Fehler beim Stats-Update:", err);
            });
    }

    function setKDStats() {
        const kills = prompt("Neue Total Kills eingeben:", "1337");
        if (kills === null) return;
        const parsedKills = Number(kills);

        if (isNaN(parsedKills)) {
            alert("Bitte eine gültige Zahl für Kills eingeben.");
            return;
        }

        updateKDStats(parsedKills);
    }

    /***************************************
     * Air strafing
     ***************************************/
    let spaceHeld = false;
    let turningLeft = false;
    let turningRight = false;

    let lastMoveTime = 0;
    const activeTimeout = 150;

    document.addEventListener('mousemove', e => {
        if (e.movementX < 0) {
            turningLeft = true;
            turningRight = false;
        } else if (e.movementX > 0) {
            turningRight = true;
            turningLeft = false;
        }
        lastMoveTime = Date.now();
    });

    document.addEventListener('keydown', e => {
        if (e.code === 'Space') spaceHeld = true;
    });

    document.addEventListener('keyup', e => {
        if (e.code === 'Space') spaceHeld = false;
    });

    function simulateKey(code, down = true) {
        const event = new KeyboardEvent(down ? 'keydown' : 'keyup', {
            code: code,
            key: code.replace('Key', ''),
            keyCode: code === 'KeyA' ? 65 : 68,
            which: code === 'KeyA' ? 65 : 68,
            bubbles: true,
            cancelable: true,
        });
        document.dispatchEvent(event);
    }

    let aHeld = false;
    let dHeld = false;

    function loop() {
        const now = Date.now();
        const mouseActive = (now - lastMoveTime) < activeTimeout;
        if (kourInstance.config.airStrafing) {
            if (spaceHeld && mouseActive) {
                if (turningLeft && !aHeld) {
                    simulateKey('KeyA', true);
                    aHeld = true;
                } else if (!turningLeft && aHeld) {
                    simulateKey('KeyA', false);
                    aHeld = false;
                }

                if (turningRight && !dHeld) {
                    simulateKey('KeyD', true);
                    dHeld = true;
                } else if (!turningRight && dHeld) {
                    simulateKey('KeyD', false);
                    dHeld = false;
                }
            } else {
                if (aHeld) {
                    simulateKey('KeyA', false);
                    aHeld = false;
                }
                if (dHeld) {
                    simulateKey('KeyD', false);
                    dHeld = false;
                }
            }

            requestAnimationFrame(loop);
        }
    }
    loop();

    /***************************************
     * ESP
     ***************************************/
    let gl = null;
    const filters = [
        { min: 1481, max: 1483 },
        { min: 1553, max: 1555 },
        { min: 5615, max: 5617 },
        { min: 3875, max: 3877 },
    ];

    window.espEnabled = true;

    window.addEventListener("keydown", (e) => {
        if (e.key.toLowerCase() === "p") {
            window.espEnabled = !window.espEnabled;
            console.log(`[Vortex ESP] Toggled ${window.espEnabled ? "ON" : "OFF"}`);
        }
    });

    const WebGL = WebGL2RenderingContext.prototype;

    HTMLCanvasElement.prototype.getContext = new Proxy(
        HTMLCanvasElement.prototype.getContext,
        {
            apply(target, thisArgs, args) {
                if (args[1]) {
                    args[1].preserveDrawingBuffer = true;
                }
                return Reflect.apply(...arguments);
            },
        }
    );

    try {
        window.espColor = JSON.parse(localStorage.getItem("espColorRGB")) || { r: 0, g: 0, b: 0 };
    } catch {
        window.espColor = { r: 0, g: 0, b: 0 };
    }

    const drawHandler = {
        apply(target, thisArgs, args) {
            const count = args[1];
            const blockarms = document.getElementById("blockarms");
            if (count === 24 && settings.damagenumbersoff) return;
            if (blockarms && blockarms.checked && count === 1098) return;

            const program = thisArgs.getParameter(thisArgs.CURRENT_PROGRAM);
            if (!program.uniforms) {
                program.uniforms = {
                    vertexCount: thisArgs.getUniformLocation(program, "vertexCount"),
                    espToggle: thisArgs.getUniformLocation(program, "espToggle"),
                    gnilgnim: thisArgs.getUniformLocation(program, "gnilgnim"),
                    espColor: thisArgs.getUniformLocation(program, "espColor"),
                };
            }

            if (program.uniforms.vertexCount) {
                thisArgs.uniform1f(program.uniforms.vertexCount, count);
            }
            if (program.uniforms.espToggle) {
                thisArgs.uniform1f(program.uniforms.espToggle, window.espEnabled ? 1.0 : 0.0);
            }
            if (program.uniforms.gnilgnim) {
                thisArgs.uniform1f(program.uniforms.gnilgnim, 13371337.0);
            }
            if (program.uniforms.espColor && window.espColor) {
                const { r, g, b } = window.espColor;
                thisArgs.uniform3f(program.uniforms.espColor, r / 255, g / 255, b / 255);
            }

            gl = thisArgs;
            return Reflect.apply(...arguments);
        },
    };

    WebGL.drawElements = new Proxy(WebGL.drawElements, drawHandler);
    WebGL.drawElementsInstanced = new Proxy(WebGL.drawElementsInstanced, drawHandler);

    function generateRangeConditions(varName) {
        return filters
            .map(({ min, max }) => `(${varName} >= ${min}.0 && ${varName} <= ${max}.0)`)
            .join(" || ");
    }

    WebGL.shaderSource = new Proxy(WebGL.shaderSource, {
        apply(target, thisArgs, args) {
            let [shader, src] = args;

            if (src.includes("gl_Position")) {
                const conditions = generateRangeConditions("vertexCount");
                src = src.replace(
                    /void\s+main\s*\(\s*\)\s*\{/,
                    `uniform float vertexCount;\nuniform float espToggle;\nuniform float gnilgnim;\nout float vVertexCount;\nuniform vec3 espColor;\nvoid main() {\nvVertexCount = vertexCount;\n`
                );
                src = src.replace(
                    /(gl_Position\s*=.+;)/,
                    `$1\nif (espToggle > 0.5 && (${conditions})) {\n  gl_Position.z = 0.01 + gl_Position.z * 0.1;\n}\nif (espToggle > 0.5 && gnilgnim == 13371337.0) {\n  gl_Position.z *= 1.0;\n}`
                );
            }

            if (src.includes("SV_Target0")) {
                const conditions = generateRangeConditions("vVertexCount");
                src = src
                    .replace(
                        /void\s+main\s*\(\s*\)\s*\{/,
                        `uniform float espToggle;\nuniform float gnilgnim;\nin float vVertexCount;\nuniform vec3 espColor;\nvoid main() {`
                    )
                    .replace(
                        /return;/,
                        `if (espToggle > 0.5 && (${conditions}) && SV_Target0.a > 0.5) {\n  SV_Target0 = vec4(espColor, 1.0);\n}\nif (gnilgnim == 13371337.0) {\n  SV_Target0.rgb *= 1.0;\n}\nreturn;`
                    );
            }

            args[1] = src;
            return Reflect.apply(...arguments);
        },
    });

    /***************************************
     * Color Aimbot
     ***************************************/
    let fovCircleEnabled = true;

    const fovCanvas = document.createElement('canvas');
    Object.assign(fovCanvas.style, {
        position: 'fixed',
        top: '0',
        left: '0',
        pointerEvents: 'none',
        zIndex: '9999',
    });
    document.body.appendChild(fovCanvas);

    const fovCtx = fovCanvas.getContext('2d');

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

    const fovRadius = 80;

    function drawFOVCircle() {
        fovCtx.clearRect(0, 0, fovCanvas.width, fovCanvas.height);
        if (!fovCircleEnabled) return;
        const centerX = fovCanvas.width / 2;
        const centerY = fovCanvas.height / 2;

        fovCtx.beginPath();
        fovCtx.arc(centerX, centerY, fovRadius, 0, Math.PI * 2);
        fovCtx.strokeStyle = 'rgba(0, 255, 180, 0.8)';
        fovCtx.lineWidth = 2;
        fovCtx.setLineDash([4, 4]);
        fovCtx.stroke();
        fovCtx.setLineDash([]);
    }

    const settings = {
        aimbotEnabled: true,
        aimbotSpeed: 1.2,
        aimbotTriggerButton: ['left', 'right'],
        crosshairEnabled: false,
        triggerbotEnabled: true,
        damagenumbersoff: false,
    };

    let mouseButtons = { left: false, right: false };

    document.addEventListener("mousedown", (e) => {
        if (e.button === 0) mouseButtons.left = true;
        if (e.button === 2) mouseButtons.right = true;
    });
    document.addEventListener("mouseup", (e) => {
        if (e.button === 0) mouseButtons.left = false;
        if (e.button === 2) mouseButtons.right = false;
    });

    function isTriggerPressed() {
        return settings.aimbotTriggerButton.some(btn => mouseButtons[btn]);
    }

    function isTargetPixel(r, g, b, a, t, c) {
        if (a === 0) return false;
        const dr = r - c.r;
        const dg = g - c.g;
        const db = b - c.b;
        return (dr * dr + dg * dg + db * db) <= (t * t);
    }

    function updateAimbot() {
        drawFOVCircle();
        if (!settings.aimbotEnabled || !gl || !gl.canvas || !gl.readPixels || !isTriggerPressed()) return;

        const width = Math.min(150, gl.canvas?.width || 0);
        const height = Math.min(150, gl.canvas?.height || 0);
        if (width < 10 || height < 10) return;

        const t = 20;
        const c = window.espColor;

        const centerX = gl.canvas.width / 2;
        const centerY = gl.canvas.height / 2;
        const startX = Math.floor(centerX - width / 2);
        const startY = Math.floor(centerY - height / 2);
        const pixels = new Uint8Array(width * height * 4);

        gl.readPixels(startX, startY, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);

        let closestDist = Infinity;
        let bestDX = 0;
        let bestDY = 0;

        for (let i = 0; i < pixels.length; i += 4) {
            const r = pixels[i], g = pixels[i + 1], b = pixels[i + 2], a = pixels[i + 3];
            if (isTargetPixel(r, g, b, a, t, c)) {
                const index = i / 4;
                const x = index % width;
                const y = Math.floor(index / width);
                const dx = startX + x - centerX;
                const dy = -(startY + y - centerY);
                const dist = Math.hypot(dx, dy);
                if (fovCircleEnabled && dist > fovRadius) continue;
                if (dist < closestDist) {
                    closestDist = dist;
                    bestDX = dx;
                    bestDY = dy;
                }
            }
        }

        if (closestDist < Infinity) {
            const factor = settings.aimbotSpeed;
            gl.canvas.dispatchEvent(new MouseEvent("mousemove", {
                movementX: bestDX * factor,
                movementY: bestDY * factor,
                bubbles: true,
                cancelable: true,
                composed: true,
            }));
        }
    }

    setInterval(updateAimbot, 0);

    /***************************************
     * Neues UI: Floating Panel mit Tabs (Main / Visuals / Profile)
     ***************************************/
    let keybinds = {
        toggleMenu: "o",
    };

    const savedKeybinds = localStorage.getItem("zephKeybinds");
    if (savedKeybinds) {
        try {
            keybinds = JSON.parse(savedKeybinds);
        } catch { }
    }

    function createUI() {
        const panel = document.createElement("div");
        panel.id = "vortexPanel";
        Object.assign(panel.style, {
            position: "fixed",
            top: "15px",
            left: "15px",
            width: "320px",
            maxHeight: "80vh",
            background: "radial-gradient(circle at top left, #161930 0%, #060712 60%)",
            color: "#f3f3ff",
            padding: "10px 10px 12px 10px",
            zIndex: "10000",
            fontFamily: "Segoe UI, Arial, sans-serif",
            fontSize: "13px",
            borderRadius: "12px",
            boxShadow: "0 0 22px rgba(0,0,0,0.9)",
            border: "1px solid rgba(0,255,200,0.5)",
            backdropFilter: "blur(8px)",
            display: "none",
        });

        // Draggable Bar
        const dragBar = document.createElement("div");
        Object.assign(dragBar.style, {
            height: "18px",
            marginBottom: "4px",
            display: "flex",
            alignItems: "center",
            justifyContent: "space-between",
            cursor: "move",
        });

        const title = document.createElement("div");
                title.textContent = "Vortex Menu";
        Object.assign(title.style, {
            fontSize: "13px",
            fontWeight: "600",
            letterSpacing: "0.8px",
            textTransform: "uppercase",
            color: "#a8ffe9",
        });

        const by = document.createElement("div");
        by.textContent = "By Vortex";
        Object.assign(by.style, {
            fontSize: "11px",
            opacity: "0.8",
            marginLeft: "6px",
        });

        const leftGroup = document.createElement("div");
        Object.assign(leftGroup.style, {
            display: "flex",
            alignItems: "center",
            gap: "6px",
        });
        leftGroup.appendChild(title);
        leftGroup.appendChild(by);

        const closeBtn = document.createElement("div");
        closeBtn.textContent = "×";
        Object.assign(closeBtn.style, {
            fontSize: "15px",
            cursor: "pointer",
            color: "#ff6f8a",
            padding: "0 4px",
        });
        closeBtn.onclick = () => {
            panel.style.display = "none";
        };

        dragBar.appendChild(leftGroup);
        dragBar.appendChild(closeBtn);
        panel.appendChild(dragBar);

        // Drag Handling
        (function makeDraggable(el, handle) {
            let offsetX = 0, offsetY = 0, startX = 0, startY = 0, dragging = false;
            handle.addEventListener("mousedown", (e) => {
                if (e.target === closeBtn) return;
                dragging = true;
                startX = e.clientX;
                startY = e.clientY;
                const rect = el.getBoundingClientRect();
                offsetX = startX - rect.left;
                offsetY = startY - rect.top;
                document.addEventListener("mousemove", onMove);
                document.addEventListener("mouseup", onUp);
            });

            function onMove(e) {
                if (!dragging) return;
                const x = e.clientX - offsetX;
                const y = e.clientY - offsetY;
                el.style.left = Math.max(0, Math.min(window.innerWidth - el.offsetWidth, x)) + "px";
                el.style.top = Math.max(0, Math.min(window.innerHeight - el.offsetHeight, y)) + "px";
            }

            function onUp() {
                dragging = false;
                document.removeEventListener("mousemove", onMove);
                document.removeEventListener("mouseup", onUp);
            }
        })(panel, dragBar);

        // Tab-Leiste
        const tabBar = document.createElement("div");
        Object.assign(tabBar.style, {
            display: "grid",
            gridTemplateColumns: "repeat(3, 1fr)",
            gap: "4px",
            marginBottom: "8px",
        });

        function createTabButton(label, key) {
            const btn = document.createElement("button");
            btn.textContent = label;
            Object.assign(btn.style, {
                padding: "4px 0",
                background: "rgba(12,14,28,0.9)",
                border: "1px solid rgba(0,255,200,0.35)",
                borderRadius: "10px",
                fontSize: "12px",
                color: "#d9e5ff",
                cursor: "pointer",
                transition: "all 0.15s",
            });
            btn.dataset.tabKey = key;
            return btn;
        }

        const tabMain = createTabButton("Main", "main");
        const tabVisuals = createTabButton("Visuals", "visuals");
        const tabProfile = createTabButton("Profile", "profile");

        tabBar.appendChild(tabMain);
        tabBar.appendChild(tabVisuals);
        tabBar.appendChild(tabProfile);
        panel.appendChild(tabBar);

        // Panel-Container
        const content = document.createElement("div");
        Object.assign(content.style, {
            maxHeight: "calc(80vh - 60px)",
            overflowY: "auto",
        });
        panel.appendChild(content);

        const panelMain = document.createElement("div");
        const panelVisuals = document.createElement("div");
        const panelProfile = document.createElement("div");

        [panelMain, panelVisuals, panelProfile].forEach(p => {
            p.style.display = "none";
        });

        /********** MAIN TAB – Hauptfunktionen (Cards mit Switch) **********/
        (function buildMainTab() {
            const grid = document.createElement("div");
            Object.assign(grid.style, {
                display: "grid",
                gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
                gap: "8px",
            });

            function createMainCard(title, desc, icon, initial, onToggle) {
                const card = document.createElement("div");
                Object.assign(card.style, {
                    borderRadius: "10px",
                    background: "linear-gradient(135deg, #181b36, #15172a)",
                    border: "1px solid rgba(0,255,200,0.35)",
                    padding: "8px 8px 6px 8px",
                    display: "flex",
                    flexDirection: "column",
                    justifyContent: "space-between",
                    minHeight: "72px",
                    transition: "all 0.18s",
                });

                const topRow = document.createElement("div");
                Object.assign(topRow.style, {
                    display: "flex",
                    alignItems: "center",
                    justifyContent: "space-between",
                });

                const left = document.createElement("div");
                const iconSpan = document.createElement("span");
                iconSpan.textContent = icon;
                Object.assign(iconSpan.style, {
                    fontSize: "16px",
                    marginRight: "4px",
                });

                const titleSpan = document.createElement("span");
                titleSpan.textContent = title;
                Object.assign(titleSpan.style, {
                    fontSize: "12px",
                    fontWeight: "600",
                });

                const leftRow = document.createElement("div");
                Object.assign(leftRow.style, {
                    display: "flex",
                    alignItems: "center",
                });
                leftRow.appendChild(iconSpan);
                leftRow.appendChild(titleSpan);
                left.appendChild(leftRow);

                const toggle = document.createElement("input");
                toggle.type = "checkbox";
                toggle.checked = initial;
                Object.assign(toggle.style, {
                    width: "14px",
                    height: "14px",
                    cursor: "pointer",
                });

                topRow.appendChild(left);
                topRow.appendChild(toggle);

                const descEl = document.createElement("div");
                descEl.textContent = desc;
                Object.assign(descEl.style, {
                    fontSize: "11px",
                    color: "#9aa7d5",
                    marginTop: "3px",
                });

                card.appendChild(topRow);
                card.appendChild(descEl);

                function applyState(on) {
                    card.style.boxShadow = on ? "0 0 8px rgba(0,255,200,0.3)" : "none";
                    card.style.borderColor = on ? "rgba(0,255,200,0.6)" : "rgba(0,255,200,0.35)";
                }
                applyState(initial);

                toggle.addEventListener("change", () => {
                    applyState(toggle.checked);
                    onToggle(toggle.checked);
                });

                card.addEventListener("mouseenter", () => {
                    card.style.transform = "translateY(-1px)";
                });
                card.addEventListener("mouseleave", () => {
                    card.style.transform = "translateY(0)";
                });

                return card;
            }

            grid.appendChild(
                createMainCard(
                    "Invisibility",
                    "Blockt Damage-Pakete -> unsichtbar.",
                    "👻",
                    kourInstance.config.Invisible,
                    v => { kourInstance.config.Invisible = v; }
                )
            );

            grid.appendChild(
                createMainCard(
                    "Aimbot",
                    "Color-basiertes Aiming auf ESP-Farbe.",
                    "🎯",
                    settings.aimbotEnabled,
                    v => { settings.aimbotEnabled = v; }
                )
            );

            grid.appendChild(
                createMainCard(
                    "AntiPlayer",
                    "Random Movement (AntiAim).",
                    "🌀",
                    kourInstance.config.AntiAim,
                    v => { kourInstance.config.AntiAim = v; }
                )
            );

            grid.appendChild(
                createMainCard(
                    "Air Strafing",
                    "Automatisches A/D in der Luft.",
                    "💨",
                    kourInstance.config.airStrafing,
                    v => { kourInstance.config.airStrafing = v; }
                )
            );

            grid.appendChild(
                createMainCard(
                    "Hide Arms",
                    "Versteckt die eigenen Arme.",
                    "✋",
                    true,
                    v => {
                        const blockarms = document.getElementById("blockarms");
                        if (blockarms) blockarms.checked = v;
                    }
                )
            );

            panelMain.appendChild(grid);

            // versteckte Checkbox für Logic (wird vom Card-Button gesteuert)
            const hiddenBlockarms = document.createElement("input");
            hiddenBlockarms.type = "checkbox";
            hiddenBlockarms.id = "blockarms";
            hiddenBlockarms.checked = true;
            hiddenBlockarms.style.display = "none";
            panelMain.appendChild(hiddenBlockarms);
        })();

        /********** VISUALS TAB – ESP, FOV, Farbe **********/
        (function buildVisualsTab() {
            const container = document.createElement("div");
            container.style.display = "flex";
            container.style.flexDirection = "column";
            container.style.gap = "8px";

            function createLineToggle(label, desc, initial, onChange) {
                const row = document.createElement("div");
                Object.assign(row.style, {
                    display: "flex",
                    justifyContent: "space-between",
                    alignItems: "center",
                    background: "linear-gradient(135deg, #15172a, #15162a)",
                    borderRadius: "8px",
                    border: "1px solid rgba(0,255,200,0.25)",
                    padding: "6px 8px",
                });

                const textBox = document.createElement("div");
                const titleEl = document.createElement("div");
                titleEl.textContent = label;
                titleEl.style.fontSize = "12px";
                titleEl.style.fontWeight = "600";

                const descEl = document.createElement("div");
                descEl.textContent = desc;
                descEl.style.fontSize = "11px";
                descEl.style.color = "#9aa7d5";

                textBox.appendChild(titleEl);
                textBox.appendChild(descEl);

                const chk = document.createElement("input");
                chk.type = "checkbox";
                chk.checked = initial;
                chk.style.cursor = "pointer";

                chk.addEventListener("change", () => onChange(chk.checked));

                row.appendChild(textBox);
                row.appendChild(chk);

                return row;
            }

            container.appendChild(
                createLineToggle(
                    "ESP",
                    "Visual Outline & Wallhack.",
                    window.espEnabled,
                    v => { window.espEnabled = v; }
                )
            );

            container.appendChild(
                createLineToggle(
                    "FOV Circle",
                    "Zeigt die Aimbot-Reichweite.",
                    fovCircleEnabled,
                    v => { fovCircleEnabled = v; }
                )
            );

            // ESP-Farbe
            const colorRow = document.createElement("div");
            Object.assign(colorRow.style, {
                display: "flex",
                alignItems: "center",
                justifyContent: "space-between",
                background: "linear-gradient(135deg, #15172a, #15162a)",
                borderRadius: "8px",
                border: "1px solid rgba(0,255,200,0.25)",
                padding: "6px 8px",
            });

            const labelBox = document.createElement("div");
            const l1 = document.createElement("div");
            l1.textContent = "ESP Color";
            Object.assign(l1.style, {
                fontSize: "12px",
                fontWeight: "600",
            });
            const l2 = document.createElement("div");
            l2.textContent = "Farbe der ESP-Treffer.";
            Object.assign(l2.style, {
                fontSize: "11px",
                color: "#9aa7d5",
            });

            labelBox.appendChild(l1);
            labelBox.appendChild(l2);

            function hexToRgb(hex) {
                const bigint = parseInt(hex.slice(1), 16);
                return {
                    r: (bigint >> 16) & 255,
                    g: (bigint >> 8) & 255,
                    b: bigint & 255
                };
            }

            let savedRgb = localStorage.getItem("espColorRGB");
            if (savedRgb) {
                try {
                    window.espColor = JSON.parse(savedRgb);
                } catch {
                    window.espColor = { r: 0, g: 0, b: 0 };
                }
            } else {
                window.espColor = { r: 0, g: 0, b: 0 };
            }

            const colorInput = document.createElement("input");
            colorInput.type = "color";
            colorInput.value = `#${((1 << 24) + (window.espColor.r << 16) + (window.espColor.g << 8) + window.espColor.b).toString(16).slice(1)}`;
            Object.assign(colorInput.style, {
                width: "40px",
                height: "22px",
                borderRadius: "4px",
                border: "1px solid rgba(0,255,200,0.4)",
                background: "transparent",
                cursor: "pointer",
                padding: "0",
            });

            colorInput.addEventListener("input", (e) => {
                const rgb = hexToRgb(e.target.value);
                window.espColor = rgb;
                localStorage.setItem("espColorRGB", JSON.stringify(rgb));
            });

            colorRow.appendChild(labelBox);
            colorRow.appendChild(colorInput);

            container.appendChild(colorRow);

            panelVisuals.appendChild(container);
        })();

    /********** PROFILE TAB – Name, Class, Skins, Profile Modder **********/
        (function buildProfileTab() {
            const col = document.createElement("div");
            col.style.display = "flex";
            col.style.flexDirection = "column";
            col.style.gap = "6px";

            function createProfileButton(text, onClick) {
                const btn = document.createElement("button");
                btn.textContent = text;
                Object.assign(btn.style, {
                    width: "100%",
                    padding: "7px 8px",
                    background: "linear-gradient(135deg, #13162a, #171a34)",
                    borderRadius: "8px",
                    border: "1px solid rgba(0,255,200,0.35)",
                    color: "#e5eeff",
                    cursor: "pointer",
                    textAlign: "left",
                    fontSize: "12px",
                    transition: "all 0.18s",
                });
                btn.addEventListener("click", onClick);
                btn.addEventListener("mouseover", () => {
                    btn.style.background = "linear-gradient(135deg, #1f2340, #252a4c)";
                    btn.style.boxShadow = "0 0 8px rgba(0,255,200,0.3)";
                });
                btn.addEventListener("mouseout", () => {
                    btn.style.background = "linear-gradient(135deg, #13162a, #171a34)";
                    btn.style.boxShadow = "none";
                });
                return btn;
            }

            // Name
            col.appendChild(
                createProfileButton("Edit Name", () => {
                    const savedName = localStorage.getItem("playerNickname") || "";
                    const newName = prompt("Enter your nickname:", savedName);
                    if (newName !== null && newName.trim() !== "") {
                        localStorage.setItem("playerNickname", newName.trim());
                        if (window.location.href.includes("#")) {
                            unityInstance.SendMessage("MapScripts", "SetNickname", newName.trim());
                        }
                    }
                })
            );

            // Class Auswahl (öffnet kleines Dropdown Overlay)
            col.appendChild(
                createProfileButton("Select Class (V Key im Match)", () => {
                    // Re-use setClassKills Map zum Anzeigen? – hier simpler Prompt:
                    const classMapSelect = {
                        "0": "Soldier",
                        "1": "Hitman",
                        "2": "Gunner",
                        "3": "Heavy",
                        "4": "Rocketeer",
                        "5": "Agent",
                        "6": "Brawler",
                        "7": "Investor",
                        "8": "Assassin",
                        "9": "Juggernaut",
                        "10": "Recon",
                        "11": "Pyro",
                        "12": "Rayblader"
                    };
                    const id = prompt(
                        "Class ID wählen:\n" +
                        Object.entries(classMapSelect).map(([id, name]) => `${id} = ${name}`).join("\n"),
                        localStorage.getItem("selectedClass") || "0"
                    );
                    if (id === null) return;
                    if (!classMapSelect[id]) {
                        alert("Ungültige Class ID");
                        return;
                    }
                    localStorage.setItem("selectedClass", parseInt(id));
                    if (window.location.href.includes("#")) {
                        unityInstance.SendMessage("MapScripts", "ChangeClassTo", parseInt(id));
                    }
                })
            );

            // Skin Picker (extra kleines Panel)
            col.appendChild(
                createProfileButton("Skins öffnen", () => {
                    const skinMenu = document.getElementById("vortexSkinMenu");
                    if (skinMenu) {
                        skinMenu.style.display = skinMenu.style.display === "none" ? "block" : "none";
                    }
                })
            );

            // Profile Modder (Stats / Kills)
            col.appendChild(
                createProfileButton("Profile Modder (Stats/Kills)", () => {
                    const dlgId = "vortexProfileModder";
                    let dlg = document.getElementById(dlgId);
                    if (!dlg) {
                        dlg = document.createElement("div");
                        dlg.id = dlgId;
                        Object.assign(dlg.style, {
                            position: "fixed",
                            top: "50%",
                            left: "50%",
                            transform: "translate(-50%, -50%)",
                            background: "radial-gradient(circle at top, #13152a 0%, #050712 70%)",
                            color: "#f3f3ff",
                            padding: "18px",
                            zIndex: "10002",
                            fontFamily: "Segoe UI, Arial, sans-serif",
                            fontSize: "12px",
                            borderRadius: "12px",
                            boxShadow: "0 0 20px rgba(0,0,0,0.8)",
                            width: "300px",
                            maxHeight: "420px",
                            overflowY: "auto",
                            border: "1px solid rgba(0,255,200,0.45)",
                        });

                        const title = document.createElement("div");
                        title.textContent = "Profile Modder";
                        title.style.fontWeight = "bold";
                        title.style.textAlign = "center";
                        title.style.marginBottom = "10px";
                        title.style.color = "#00ffd5";
                        dlg.appendChild(title);

                        function addButton(label, cb) {
                            const b = document.createElement("button");
                            b.textContent = label;
                            Object.assign(b.style, {
                                width: "100%",
                                padding: "6px 8px",
                                margin: "3px 0",
                                background: "linear-gradient(135deg, #15172b, #1e2138)",
                                borderRadius: "6px",
                                border: "1px solid rgba(0,255,200,0.35)",
                                color: "#e5eeff",
                                cursor: "pointer",
                                textAlign: "left",
                                fontSize: "12px",
                                transition: "all 0.18s",
                            });
                            b.addEventListener("click", cb);
                            b.addEventListener("mouseover", () => {
                                b.style.background = "linear-gradient(135deg, #202542, #2c3253)";
                            });
                            b.addEventListener("mouseout", () => {
                                b.style.background = "linear-gradient(135deg, #15172b, #1e2138)";
                            });
                            dlg.appendChild(b);
                        }

                        addButton("Set Class Kills", setClassKills);
                        addButton("Change Total Kills", setKDStats);

                        const statMappings = [
                            { label: "ELO", key: "elo" },
                            { label: "Chickalettas Killed", key: "chickalettasKilled" },
                            { label: "Games Played", key: "gamesPlayed" },
                            { label: "Games Won", key: "gamesWon" },
                            { label: "Knife Kills", key: "knifeKills" },
                            { label: "Assists", key: "assists" },
                            { label: "Highest Kill Streak", key: "maxKillStreak" },
                            { label: "Barrels Shot", key: "barrels" },
                            { label: "Kyles Killed", key: "kylesKilled" },
                        ];
                        statMappings.forEach(({ label, key }) => {
                            addButton(`Change ${label}`, () => {
                                const v = prompt(`Neuen Wert für ${label} eingeben:`);
                                if (v !== null) setStat(key, v);
                            });
                        });

                        const close = document.createElement("button");
                        close.textContent = "Schließen";
                        Object.assign(close.style, {
                            width: "100%",
                            marginTop: "8px",
                            padding: "6px",
                            background: "linear-gradient(135deg, #3b1f32, #52213d)",
                            borderRadius: "6px",
                            border: "1px solid rgba(255,80,120,0.5)",
                            color: "#ffe6f0",
                            cursor: "pointer",
                        });
                        close.onclick = () => dlg.remove();
                        dlg.appendChild(close);

                        document.body.appendChild(dlg);
                    } else {
                        dlg.style.display = "block";
                    }
                })
            );

            panelProfile.appendChild(col);

            // Skin-Menü separat
            const skinMenu = document.createElement("div");
            skinMenu.id = "vortexSkinMenu";
            Object.assign(skinMenu.style, {
                position: "fixed",
                top: "20%",
                left: "50%",
                transform: "translateX(-50%)",
                background: "radial-gradient(circle at top, #111327 0%, #050612 70%)",
                color: "#f3f3ff",
                padding: "14px",
                zIndex: "10002",
                borderRadius: "12px",
                border: "1px solid rgba(0,255,200,0.5)",
                boxShadow: "0 0 20px rgba(0,0,0,0.8)",
                width: "260px",
                maxHeight: "420px",
                overflowY: "auto",
                display: "none",
            });

            const skinTitle = document.createElement("div");
            skinTitle.textContent = "Skins";
            skinTitle.style.textAlign = "center";
            skinTitle.style.fontWeight = "bold";
            skinTitle.style.marginBottom = "8px";
            skinTitle.style.color = "#00ffd5";
            skinMenu.appendChild(skinTitle);

            skins.forEach(s => {
                const b = document.createElement("button");
                b.textContent = `${s.name} (${s.id})`;
                Object.assign(b.style, {
                    width: "100%",
                    padding: "5px",
                    margin: "3px 0",
                    background: "linear-gradient(135deg, #15172b, #1e2138)",
                    borderRadius: "6px",
                    border: "1px solid rgba(0,255,200,0.3)",
                    color: "#e5eeff",
                    cursor: "pointer",
                    fontSize: "12px",
                    textAlign: "left",
                });
                b.addEventListener("click", () => {
                    setSkin(s.id);
                    skinMenu.style.display = "none";
                });
                skinMenu.appendChild(b);
            });

            const closeSkin = document.createElement("button");
            closeSkin.textContent = "Schließen";
            Object.assign(closeSkin.style, {
                width: "100%",
                padding: "5px",
                marginTop: "6px",
                background: "linear-gradient(135deg, #3b1f32, #52213d)",
                borderRadius: "6px",
                border: "1px solid rgba(255,80,120,0.5)",
                color: "#ffe6f0",
                cursor: "pointer",
            });
            closeSkin.onclick = () => skinMenu.style.display = "none";
            skinMenu.appendChild(closeSkin);

            document.body.appendChild(skinMenu);
        })();

        // Panels registrieren
        content.appendChild(panelMain);
        content.appendChild(panelVisuals);
        content.appendChild(panelProfile);

        function activateTab(key) {
            // Buttons
            [tabMain, tabVisuals, tabProfile].forEach(btn => {
                const active = btn.dataset.tabKey === key;
                btn.style.background = active
                    ? "linear-gradient(135deg, #10bbaa, #63f2ff)"
                    : "rgba(12,14,28,0.9)";
                btn.style.color = active ? "#041015" : "#d9e5ff";
            });

            // Panels
            panelMain.style.display = key === "main" ? "block" : "none";
            panelVisuals.style.display = key === "visuals" ? "block" : "none";
            panelProfile.style.display = key === "profile" ? "block" : "none";
        }

        tabMain.onclick = () => activateTab("main");
        tabVisuals.onclick = () => activateTab("visuals");
        tabProfile.onclick = () => activateTab("profile");

        activateTab("main");
        document.body.appendChild(panel);
    }

    /***************************************
     * Hotkey V (Class) & Nick‑Sync
     ***************************************/
    window.addEventListener("keydown", (e) => {
        if (e.key.toLowerCase() === "v") {
            const savedClassID = localStorage.getItem("selectedClass");
            if (
                savedClassID !== null &&
                window.location.href.includes("#")
            ) {
                unityInstance.SendMessage("MapScripts", "ChangeClassTo", parseInt(savedClassID));
            }
        }
    });

    let lastHash = window.location.hash;

    setInterval(() => {
        const currentHash = window.location.hash;
        if (currentHash !== lastHash && currentHash.includes("#")) {
            lastHash = currentHash;

            const storedName = localStorage.getItem("playerNickname");
            if (storedName) {
                unityInstance.SendMessage("MapScripts", "SetNickname", storedName);
            }
        }
    }, 500);

    /***************************************
     * Menü‑Toggle (Keybind)
     ***************************************/
    document.addEventListener("keydown", function (e) {
        if (e.key === keybinds.toggleMenu && !e.target.matches("input, textarea")) {
            const panel = document.getElementById("vortexPanel");
            if (panel) {
                panel.style.display = panel.style.display === "none" ? "block" : "none";
            }
        }
    });

    window.addEventListener("load", createUI);
})();