Canadian100's client (survev.io)

Aimbot, Auto-Shoot, Spinbot, Explosive Warning, Red Lines, See Through Buildings, Enemy Health Bars for Survev.io with GUI toggle system, brightness changer, opacity changerr, fps regualtor, and other key features.

Verze ze dne 14. 04. 2025. Zobrazit nejnovější verzi.

// ==UserScript==
// @name         Canadian100's client (survev.io)
// @namespace    http://tampermonkey.net/
// @version      4.5
// @description  Aimbot, Auto-Shoot, Spinbot, Explosive Warning, Red Lines, See Through Buildings, Enemy Health Bars for Survev.io with GUI toggle system, brightness changer, opacity changerr, fps regualtor, and other key features.
// @author       Canadian100
// @match        *://survev.io/*
// @grant        unsafeWindow
// @run-at       document-end
// ==/UserScript==
(function () {
    // Default feature states
    let espEnabled = false;
    let aimbotEnabled = false;
    let autoShootEnabled = false;
    let spinbotEnabled = false;
    let explosiveWarningEnabled = true;
    let drawEnemyLines = false;
    let seeThroughBuildingsEnabled = false;
    let showHealthBars = false;
    let meleeAimbotEnabled = false;

    // FPS and Ping variables
    let fps = 0;
    let ping = 0;
    let lastTime = performance.now();
    let frames = 0;

    // Canvas Overlay Setup
    const canvas = document.createElement('canvas');
    canvas.style.position = 'fixed';
    canvas.style.top = '0';
    canvas.style.left = '0';
    canvas.style.pointerEvents = 'none';
    canvas.style.zIndex = '9998';
    document.body.appendChild(canvas);
    const ctx = canvas.getContext('2d');

    // Update Canvas Size
    function updateCanvasSize() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
    }
    window.addEventListener('resize', updateCanvasSize);
    updateCanvasSize();
    // FPS Calculation
    function updateFPS() {
        const currentTime = performance.now();
        frames++;
        if (currentTime - lastTime >= 1000) {
            fps = frames;
            frames = 0;
            lastTime = currentTime;
        }
    }

    // Ping Calculation
    function updatePing() {
        const startTime = performance.now();
        fetch("https://www.google.com/")
            .then(response => response.text())
            .then(() => {
                const endTime = performance.now();
                ping = endTime - startTime;
            })
            .catch(() => ping = 0);
    }

    // Stats Box Setup
    const statsBox = document.createElement('div');
    statsBox.style.position = 'fixed';
    statsBox.style.top = '300px';
    statsBox.style.left = '20px';
    statsBox.style.padding = '15px';
    statsBox.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
    statsBox.style.borderRadius = '10px';
    statsBox.style.color = 'white';
    statsBox.style.fontFamily = 'Arial, sans-serif';
    statsBox.style.zIndex = '9999';
    statsBox.style.boxShadow = '0 0 10px rgba(255, 255, 255, 0.5)';
    document.body.appendChild(statsBox);
    const fpsElement = document.createElement('div');
    const pingElement = document.createElement('div');
    const killsElement = document.createElement('div');

    fpsElement.style.fontSize = '18px';
    pingElement.style.fontSize = '18px';
    killsElement.style.fontSize = '18px';

    statsBox.appendChild(fpsElement);
    statsBox.appendChild(pingElement);
    statsBox.appendChild(killsElement);

    function updateStats() {
        fpsElement.textContent = `FPS: ${fps}`;
        pingElement.textContent = `Ping: ${ping.toFixed(2)} ms`;
        killsElement.textContent = `Kills: ${unsafeWindow.activePlayer?.kills || 0}`;
    }

    setInterval(() => {
        updateFPS();
        updatePing();
        updateStats();
    }, 1000 / 60);
    const popupWindow = document.createElement('div');
    popupWindow.style.position = 'fixed';
    popupWindow.style.top = '50%';
    popupWindow.style.left = '50%';
    popupWindow.style.transform = 'translate(-50%, -50%)';
    popupWindow.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
    popupWindow.style.color = 'white';
    popupWindow.style.padding = '20px';
    popupWindow.style.borderRadius = '10px';
    popupWindow.style.display = 'none';
    popupWindow.style.zIndex = '9999';
    document.body.appendChild(popupWindow);

    popupWindow.innerHTML = `
        <h2>Enable Features</h2>
        <label><input type="checkbox" id="aimbotCheckbox"> Aimbot [X]</label><br>
        <label><input type="checkbox" id="autoShootCheckbox"> Trigger Bot [Z]</label><br>
        <label><input type="checkbox" id="spinbotCheckbox"> Spinbot [C]</label><br>
        <label><input type="checkbox" id="explosiveWarningCheckbox"> Explosive Warning [I]</label><br>
        <label><input type="checkbox" id="enemyLinesCheckbox"> Red Lines to Enemies [K]</label><br>
        <label><input type="checkbox" id="seeThroughCheckbox"> See Through Buildings [Y]</label><br>
        <label><input type="checkbox" id="healthBarCheckbox"> Show Enemy Health Bars [H]</label><br>
        <label><input type="checkbox" id="espCheckbox"> ESP Line to Player [E]</label><br>
        <label><input type="checkbox" id="meleeAimbotCheckbox"> Melee Aimbot [M]</label><br>
        <button id="closePopupButton">Close</button>
    `;
    const espCheckbox = document.getElementById('espCheckbox');
    const aimbotCheckbox = document.getElementById('aimbotCheckbox');
    const autoShootCheckbox = document.getElementById('autoShootCheckbox');
    const spinbotCheckbox = document.getElementById('spinbotCheckbox');
    const explosiveWarningCheckbox = document.getElementById('explosiveWarningCheckbox');
    const enemyLinesCheckbox = document.getElementById('enemyLinesCheckbox');
    const seeThroughCheckbox = document.getElementById('seeThroughCheckbox');
    const healthBarCheckbox = document.getElementById('healthBarCheckbox');
    const meleeAimbotCheckbox = document.getElementById('meleeAimbotCheckbox');
    const closePopupButton = document.getElementById('closePopupButton');

    function togglePopup() {
        popupWindow.style.display = popupWindow.style.display === 'none' ? 'block' : 'none';
    }

    closePopupButton.addEventListener('click', togglePopup);

    window.addEventListener('keydown', (e) => {
        switch (e.key.toLowerCase()) {
            case 'e': espEnabled = !espEnabled; espCheckbox.checked = espEnabled; break;
            case 'x': aimbotEnabled = !aimbotEnabled; aimbotCheckbox.checked = aimbotEnabled; break;
            case 'z': autoShootEnabled = !autoShootEnabled; autoShootCheckbox.checked = autoShootEnabled; break;
            case 'c': spinbotEnabled = !spinbotEnabled; spinbotCheckbox.checked = spinbotEnabled; break;
            case 'i': explosiveWarningEnabled = !explosiveWarningEnabled; explosiveWarningCheckbox.checked = explosiveWarningEnabled; break;
            case 'k': drawEnemyLines = !drawEnemyLines; enemyLinesCheckbox.checked = drawEnemyLines; break;
            case 'y': seeThroughBuildingsEnabled = !seeThroughBuildingsEnabled; seeThroughCheckbox.checked = seeThroughBuildingsEnabled; break;
            case 'h': showHealthBars = !showHealthBars; healthBarCheckbox.checked = showHealthBars; break;
            case 'm': meleeAimbotEnabled = !meleeAimbotEnabled; meleeAimbotCheckbox.checked = meleeAimbotEnabled; break;
            case 't': togglePopup(); break;
        }
    });
    function triggerBot(player) {
        if (!autoShootEnabled || !player || !player.weapon || !player.weapon.canShoot) return;

        const enemies = unsafeWindow.players.filter(p =>
            p && p.isAlive && p.team !== player.team && isVisible(player, p)
        );

        const target = enemies.find(enemy => {
            const dist = distance(player.x, player.y, enemy.x, enemy.y);
            return dist < 400;
        });

        if (target) player.weapon.shoot();
    }
    function drawExplosiveWarning(ctx, player) {
        if (!explosiveWarningEnabled) return;

        unsafeWindow.projectiles.forEach(proj => {
            if (proj.type === 'explosive') {
                const dist = distance(player.x, player.y, proj.x, proj.y);
                if (dist < 200) {
                    ctx.beginPath();
                    ctx.arc(proj.x, proj.y, 30, 0, 2 * Math.PI);
                    ctx.strokeStyle = 'red';
                    ctx.lineWidth = 2;
                    ctx.stroke();
                }
            }
        });
    }
    function drawHealthBars(ctx, player) {
        if (!showHealthBars) return;

        unsafeWindow.players.forEach(enemy => {
            if (enemy.team !== player.team && enemy.isAlive) {
                ctx.fillStyle = 'green';
                ctx.fillRect(enemy.x - 20, enemy.y - 40, 40 * (enemy.health / enemy.maxHealth), 5);
                ctx.strokeStyle = 'black';
                ctx.strokeRect(enemy.x - 20, enemy.y - 40, 40, 5);
            }
        });
    }
    function drawESP(ctx, player) {
        if (!espEnabled) return;
        ctx.lineWidth = 2;
        ctx.strokeStyle = 'lime';

        unsafeWindow.players.forEach(enemy => {
            if (enemy.team !== player.team && enemy.isAlive) {
                ctx.beginPath();
                ctx.moveTo(player.x, player.y);
                ctx.lineTo(enemy.x, enemy.y);
                ctx.stroke();
            }
        });
    }
    function seeThroughBuildings() {
        if (!seeThroughBuildingsEnabled) return;

        const obstacles = document.querySelectorAll('.bunker, .building');
        obstacles.forEach(obs => {
            obs.style.opacity = '0.3';
        });
    }
    function aimbot(player) {
        if (!aimbotEnabled || !player || !player.weapon) return;

        const enemies = unsafeWindow.players.filter(p =>
            p && p.isAlive && p.team !== player.team && isVisible(player, p)
        );

        let closest = null;
        let closestDist = Infinity;

        enemies.forEach(enemy => {
            const dist = distance(player.x, player.y, enemy.x, enemy.y);
            if (dist < closestDist) {
                closestDist = dist;
                closest = enemy;
            }
        });

        if (closest) {
            const dx = closest.x - player.x;
            const dy = closest.y - player.y;
            const angle = Math.atan2(dy, dx);
            player.aimAngle = angle;
        }
    }
    function meleeAimbot(player) {
        if (!meleeAimbotEnabled || !player || !player.weapon || player.weapon.type !== 'melee') return;

        const enemies = unsafeWindow.players.filter(p =>
            p && p.isAlive && p.team !== player.team && isVisible(player, p)
        );

        let closest = null;
        let closestDist = Infinity;

        enemies.forEach(enemy => {
            const dist = distance(player.x, player.y, enemy.x, enemy.y);
            if (dist < closestDist) {
                closestDist = dist;
                closest = enemy;
            }
        });

        if (closest) {
            const dx = closest.x - player.x;
            const dy = closest.y - player.y;
            player.aimAngle = Math.atan2(dy, dx);

            player.moveX = Math.sign(dx);
            player.moveY = Math.sign(dy);

            if (closestDist < 50 && player.weapon.canAttack) {
                player.weapon.attack();
            }
        }
    }
    let spinAngle = 0;
    function spinbot(player) {
        if (!spinbotEnabled || !player) return;
        spinAngle += 0.3;
        player.aimAngle = spinAngle;
    }
    function drawTracerLines(ctx, player) {
        if (!drawEnemyLines) return;

        ctx.strokeStyle = 'red';
        ctx.lineWidth = 10;

        unsafeWindow.players.forEach(enemy => {
            if (enemy.isAlive && enemy.team !== player.team) {
                ctx.beginPath();
                ctx.moveTo(player.x, player.y);
                ctx.lineTo(enemy.x + enemy.vx * 3, enemy.y + enemy.vy * 3); // Predictive
                ctx.stroke();
            }
        });
    }
    function distance(x1, y1, x2, y2) {
        return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
    }

    function isVisible(player, enemy) {
        return true; // Placeholder: add raycast/visibility check here if needed
    }
    setInterval(() => {
        const player = unsafeWindow.activePlayer;
        if (!player) return;

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        aimbot(player);
        meleeAimbot(player);
        triggerBot(player);
        spinbot(player);
        seeThroughBuildings();
        drawESP(ctx, player);
        drawTracerLines(ctx, player);
        drawExplosiveWarning(ctx, player);
        drawHealthBars(ctx, player);
    }, 1000 / 60);
})(); // END of entire userscript

(function () {
    // Declare the GUI container but don't append it yet
    let guiContainer;

    // Function to create and display the GUI container when the 'L' key is pressed
    function createGUI() {
        // Create the draggable GUI container
        guiContainer = document.createElement('div');
        guiContainer.style.position = 'fixed';
        guiContainer.style.left = '50%';
        guiContainer.style.top = '50%';
        guiContainer.style.transform = 'translate(-50%, -50%)';
        guiContainer.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
        guiContainer.style.padding = '20px';
        guiContainer.style.borderRadius = '10px';
        guiContainer.style.color = 'white';
        guiContainer.style.zIndex = '9999';
        guiContainer.style.display = 'none'; // Initially hidden
        guiContainer.style.display = 'flex';
        guiContainer.style.flexDirection = 'column'; // Stack elements vertically
        guiContainer.style.gap = '10px'; // Adds space between elements
        guiContainer.style.maxWidth = '150px'; // Max width of the HUD container
        guiContainer.style.width = '100%'; // Allows for responsive resizing while respecting max-width
        document.body.appendChild(guiContainer);

        // Add title to the GUI
        const title = document.createElement('h2');
        title.innerText = 'Game Settings';
        guiContainer.appendChild(title);

        // Brightness control label
        const brightnessLabel = document.createElement('label');
        brightnessLabel.innerText = 'Set Game Brightness: ';
        guiContainer.appendChild(brightnessLabel);

        // Create brightness slider
        const brightnessSlider = document.createElement('input');
        brightnessSlider.type = 'range';
        brightnessSlider.min = '0';
        brightnessSlider.max = '2';
        brightnessSlider.step = '0.01';
        brightnessSlider.value = '1'; // Default brightness
        guiContainer.appendChild(brightnessSlider);

        // Event listener for brightness slider
        brightnessSlider.addEventListener('input', function () {
            // Update the brightness of the game
            const brightnessValue = brightnessSlider.value;
            document.body.style.filter = `brightness(${brightnessValue})`;
        });

        // Opacity control label for environment elements (trees, buildings, containers, bushes)
        const opacityLabel = document.createElement('label');
        opacityLabel.innerText = 'Set Environment Opacity: ';
        guiContainer.appendChild(opacityLabel);

        // Create opacity slider
        const opacitySlider = document.createElement('input');
        opacitySlider.type = 'range';
        opacitySlider.min = '0';
        opacitySlider.max = '1';
        opacitySlider.step = '0.01';
        opacitySlider.value = '1'; // Default opacity
        guiContainer.appendChild(opacitySlider);

        // Event listener for opacity slider
        opacitySlider.addEventListener('input', function () {
            // Update opacity of in-game objects (trees, buildings, containers, bushes)
            const opacityValue = opacitySlider.value;
            const environmentObjects = document.querySelectorAll('.tree, .building, .container, .bush'); // Example classes
            environmentObjects.forEach(object => {
                object.style.opacity = opacityValue; // Apply opacity to each object
            });
        });

        // Max FPS control label
        const fpsLabel = document.createElement('label');
        fpsLabel.innerText = 'Set Max FPS: ';
        guiContainer.appendChild(fpsLabel);

        // Create FPS slider
        const fpsSlider = document.createElement('input');
        fpsSlider.type = 'range';
        fpsSlider.min = '0';
        fpsSlider.max = '500';
        fpsSlider.step = '1';
        fpsSlider.value = '60'; // Default FPS
        guiContainer.appendChild(fpsSlider);

        // Event listener for FPS slider
        fpsSlider.addEventListener('input', function () {
            // Set the max FPS based on slider value
            const fpsValue = fpsSlider.value;
            // Example FPS limiter (adjust as needed)
            document.querySelector('canvas').style['max-fps'] = fpsValue;
        });

        // Add Lock HUD checkbox (placed under the last slider)
        const lockHudLabel = document.createElement('label');
        lockHudLabel.innerText = 'Lock HUD in Place: ';
        guiContainer.appendChild(lockHudLabel);

        const lockHudCheckbox = document.createElement('input');
        lockHudCheckbox.type = 'checkbox';
        guiContainer.appendChild(lockHudCheckbox);

        // Draggable HUD logic
        let isDragging = false;
        let offsetX, offsetY;
        let isHudLocked = false;

        // Make the GUI container draggable (if not locked)
        guiContainer.addEventListener('mousedown', (e) => {
            if (!isHudLocked) {
                isDragging = true;
                offsetX = e.clientX - guiContainer.offsetLeft;
                offsetY = e.clientY - guiContainer.offsetTop;
            }
        });

        document.addEventListener('mousemove', (e) => {
            if (isDragging && !isHudLocked) {
                guiContainer.style.left = `${e.clientX - offsetX}px`;
                guiContainer.style.top = `${e.clientY - offsetY}px`;
            }
        });

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

        // Listen for lock/unlock checkbox change
        lockHudCheckbox.addEventListener('change', function () {
            isHudLocked = lockHudCheckbox.checked; // Lock or unlock the HUD based on checkbox state
        });
    }

    // Toggle GUI visibility with "L" key
    let guiVisible = false;
    function toggleGUI() {
        if (!guiVisible) {
            createGUI(); // Create the GUI if not already created
        }
        guiVisible = !guiVisible;
        guiContainer.style.display = guiVisible ? 'block' : 'none'; // Show/hide the container
    }

    // Keybind for showing/hiding the GUI
    window.addEventListener('keydown', (event) => {
        if (event.key.toLowerCase() === 'l') {
            toggleGUI();
        }
    });
})();
(function () {
    let locked = false;

    // 🧹 Remove any existing HUD first
    const existingHud = document.getElementById('customHud');
    if (existingHud) {
        existingHud.remove();
    }

    // Create the HUD
    const hud = document.createElement('div');
    hud.id = 'customHud'; // Unique ID to detect duplicates
    Object.assign(hud.style, {
        position: 'fixed',
        top: '50%',
        left: '50%',
        transform: 'translate(-50%, -50%)',
        backgroundColor: 'rgba(0, 0, 0, 0.8)',
        color: 'white',
        padding: '20px',
        borderRadius: '10px',
        zIndex: '9999',
        cursor: 'move',
        display: 'block'
    });
    document.body.appendChild(hud);

    // Draggable logic
    let isDragging = false;
    let offsetX = 0, offsetY = 0;

    hud.addEventListener('mousedown', (e) => {
        if (!locked) {
            isDragging = true;
            offsetX = e.clientX - hud.offsetLeft;
            offsetY = e.clientY - hud.offsetTop;
            document.addEventListener('mousemove', onMouseMove);
        }
    });

    document.addEventListener('mouseup', () => {
        isDragging = false;
        document.removeEventListener('mousemove', onMouseMove);
    });

    function onMouseMove(e) {
        if (isDragging && !locked) {
            hud.style.left = `${e.clientX - offsetX}px`;
            hud.style.top = `${e.clientY - offsetY}px`;
        }
    }

    // HUD content
    const naturalFeaturesElement = document.createElement('div');
    const featuresElement = document.createElement('div');
    const quickSwitchElement = document.createElement('div');
    const fpsElement = document.createElement('div');
    const pingElement = document.createElement('div');
    const devInfoElement = document.createElement('div');
    const disableTextElement = document.createElement('div');

    naturalFeaturesElement.textContent = 'L = Natural Game Features';
    featuresElement.textContent = 'T = Key Features 👀';
    quickSwitchElement.textContent = 'O = Quick Switch Feature';
    fpsElement.textContent = 'FPS Rate: Adjusts every 100ms';
    pingElement.textContent = 'Ping: Developing at the moment';
    devInfoElement.textContent = 'This client is still under development. Report bugs to canadian100.0 on Discord.';
    disableTextElement.textContent = "Press 'n' to disable this HUD";

    hud.appendChild(naturalFeaturesElement);
    hud.appendChild(featuresElement);
    hud.appendChild(quickSwitchElement);
    hud.appendChild(fpsElement);
    hud.appendChild(pingElement);
    hud.appendChild(devInfoElement);
    hud.appendChild(disableTextElement);

    // Lock checkbox
    const lockCheckbox = document.createElement('input');
    lockCheckbox.type = 'checkbox';
    lockCheckbox.id = 'lockHudCheckbox';
    const lockLabel = document.createElement('label');
    lockLabel.textContent = ' Lock HUD in Place';
    lockLabel.setAttribute('for', 'lockHudCheckbox');
    hud.appendChild(lockCheckbox);
    hud.appendChild(lockLabel);

    lockCheckbox.addEventListener('change', () => {
        locked = lockCheckbox.checked;
    });

    // FPS tracking
    let fps = 0;
    let frames = 0;
    let lastTime = performance.now();

    function updateFPS() {
        const currentTime = performance.now();
        frames++;
        if (currentTime - lastTime >= 100) {
            fps = frames;
            frames = 0;
            lastTime = currentTime;
            fpsElement.textContent = `FPS Rate: Adjusts every 100ms - ${fps}`;
        }
    }

    setInterval(updateFPS, 100);

    // Toggle HUD visibility with 'n'
    window.addEventListener('keydown', (e) => {
        if (e.key.toLowerCase() === 'n') {
            hud.style.display = hud.style.display === 'none' ? 'block' : 'none';
        }
    });
})();
(function () {
    let isHudVisible = false;
    let isLocked = false;
    let switchDelay = 1000;
    let singleShotEnabled = false;
    let outOfAmmoEnabled = false;

    // Create HUD
    const hud = document.createElement('div');
    Object.assign(hud.style, {
        position: 'fixed',
        left: '50%',
        top: '50%',
        transform: 'translate(-50%, -50%)',
        background: 'rgba(0,0,0,0.8)',
        color: '#fff',
        padding: '15px',
        borderRadius: '10px',
        maxWidth: '180px',
        zIndex: 9999,
        fontSize: '12px',
        userSelect: 'none',
        flexDirection: 'column',
        gap: '8px',
        cursor: 'move',
        display: 'none'
    });
    hud.style.display = 'none';
    hud.style.display = 'flex';
    hud.style.display = 'none'; // Make sure it starts hidden
    document.body.appendChild(hud);

    // Delay Slider
    const delayLabel = document.createElement('label');
    delayLabel.textContent = 'Switch Delay (ms)';
    const delaySlider = document.createElement('input');
    delaySlider.type = 'range';
    delaySlider.min = 100;
    delaySlider.max = 3000;
    delaySlider.step = 100;
    delaySlider.value = switchDelay;
    delaySlider.addEventListener('input', () => {
        switchDelay = parseInt(delaySlider.value);
    });

    // Checkbox: After Single Shot
    const singleShotBox = document.createElement('input');
    singleShotBox.type = 'checkbox';
    singleShotBox.addEventListener('change', () => {
        singleShotEnabled = singleShotBox.checked;
    });
    const singleShotLabel = document.createElement('label');
    singleShotLabel.textContent = 'After Single Shot';
    singleShotLabel.prepend(singleShotBox);

    // Checkbox: Out of Ammo
    const outOfAmmoBox = document.createElement('input');
    outOfAmmoBox.type = 'checkbox';
    outOfAmmoBox.addEventListener('change', () => {
        outOfAmmoEnabled = outOfAmmoBox.checked;
    });
    const outOfAmmoLabel = document.createElement('label');
    outOfAmmoLabel.textContent = 'Out of Ammo';
    outOfAmmoLabel.prepend(outOfAmmoBox);

    // Checkbox: Lock HUD
    const lockBox = document.createElement('input');
    lockBox.type = 'checkbox';
    lockBox.addEventListener('change', () => {
        isLocked = lockBox.checked;
    });
    const lockLabel = document.createElement('label');
    lockLabel.textContent = 'Lock HUD';
    lockLabel.prepend(lockBox);

    // Append to HUD
    hud.appendChild(delayLabel);
    hud.appendChild(delaySlider);
    hud.appendChild(singleShotLabel);
    hud.appendChild(outOfAmmoLabel);
    hud.appendChild(lockLabel);

    // Drag logic
    let isDragging = false, offsetX = 0, offsetY = 0;
    hud.addEventListener('mousedown', (e) => {
        if (isLocked) return;
        isDragging = true;
        offsetX = e.clientX - hud.offsetLeft;
        offsetY = e.clientY - hud.offsetTop;
    });
    document.addEventListener('mousemove', (e) => {
        if (isDragging && !isLocked) {
            hud.style.left = `${e.clientX - offsetX}px`;
            hud.style.top = `${e.clientY - offsetY}px`;
        }
    });
    document.addEventListener('mouseup', () => isDragging = false);

    // Toggle HUD with 'O'
    window.addEventListener('keydown', (e) => {
        if (e.key.toLowerCase() === 'o') {
            isHudVisible = !isHudVisible;
            hud.style.display = isHudVisible ? 'flex' : 'none';
        }
    });

    // Dummy game interaction simulation (replace with real logic)
    function switchWeaponSlot() {
        const slots = [1, 2, 3].filter(slot => true); // All usable
        let currentSlot = getCurrentSlot(); // Replace this
        let nextIndex = (slots.indexOf(currentSlot) + 1) % slots.length;
        simulateKeyPress(slots[nextIndex].toString());
    }

    function getCurrentSlot() {
        return 1; // Replace with actual game detection
    }

    function simulateKeyPress(key) {
        document.dispatchEvent(new KeyboardEvent('keydown', { key }));
    }

    function switchWeaponSlotWithDelay() {
        setTimeout(() => switchWeaponSlot(), switchDelay);
    }

    // Trigger test loop (replace with actual game events)
    setInterval(() => {
        if (singleShotEnabled || outOfAmmoEnabled) {
            switchWeaponSlotWithDelay();
        }
    }, 3000);
})();