Greasy Fork

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 changer, fps regualtor, and other key features.

目前为 2025-04-11 提交的版本。查看 最新版本

// ==UserScript==
// @name         Canadian100's client (survev.io)
// @namespace    http://tampermonkey.net/
// @version      4.4
// @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 changer, fps regualtor, and other key features.
// @author       Canadian100
// @match        *://survev.io/*
// @grant        unsafeWindow
// @run-at       document-end
// ==/UserScript==

(function () {
    // Default feature states
    let aimbotEnabled = false;
    let autoShootEnabled = false;
    let spinbotEnabled = false;
    let explosiveWarningEnabled = true;
    let drawEnemyLines = false;
    let seeThroughBuildingsEnabled = false;
    let showHealthBars = false;
    let espEnabled = false;
    let meleeAimbotEnabled = false; // Melee aimbot state

    // 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/") // Simple ping test
            .then(response => response.text())
            .then(() => {
                const endTime = performance.now();
                ping = endTime - startTime;
            })
            .catch(() => ping = 0); // If request fails, set ping to 0
    }

    // Stats Box Setup
    const statsBox = document.createElement('div');
    statsBox.style.position = 'fixed';
    statsBox.style.top = '20px';
    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);

    // Update Stats Box
    function updateStats() {
        fpsElement.textContent = `FPS: ${fps}`;
        pingElement.textContent = `Ping: ${ping.toFixed(2)} ms`;
        killsElement.textContent = `Kills: ${unsafeWindow.activePlayer.kills}`;
    }

    setInterval(() => {
        updateFPS();
        updatePing();
        updateStats();
    }, 1000 / 60); // Update every 60 FPS

    // Create the Popup GUI
    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"> Auto-Shoot [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> <!-- Melee checkbox -->
        <button id="closePopupButton">Close</button>
    `;

    // Get references to checkboxes
    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 espCheckbox = document.getElementById('espCheckbox');
    const meleeAimbotCheckbox = document.getElementById('meleeAimbotCheckbox'); // Melee checkbox reference
    const closePopupButton = document.getElementById('closePopupButton');

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

    closePopupButton.addEventListener('click', togglePopup);

    // Keybinds handling
    function handleKeyPress(event) {
        switch (event.key.toLowerCase()) {
            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 'e':
                espEnabled = !espEnabled;
                espCheckbox.checked = espEnabled;
                break;
            case 'm': // Keybind for melee aimbot
                meleeAimbotEnabled = !meleeAimbotEnabled;
                meleeAimbotCheckbox.checked = meleeAimbotEnabled;
                break;
            case 't':
                togglePopup();
                break;
        }
    }

    window.addEventListener('keydown', handleKeyPress);

    // Synchronize checkboxes and feature states
    [aimbotCheckbox, autoShootCheckbox, spinbotCheckbox, explosiveWarningCheckbox, enemyLinesCheckbox, seeThroughCheckbox, healthBarCheckbox, espCheckbox, meleeAimbotCheckbox].forEach(cb => {
        cb.addEventListener('change', () => {
            aimbotEnabled = aimbotCheckbox.checked;
            autoShootEnabled = autoShootCheckbox.checked;
            spinbotEnabled = spinbotCheckbox.checked;
            explosiveWarningEnabled = explosiveWarningCheckbox.checked;
            drawEnemyLines = enemyLinesCheckbox.checked;
            seeThroughBuildingsEnabled = seeThroughCheckbox.checked;
            showHealthBars = healthBarCheckbox.checked;
            espEnabled = espCheckbox.checked;
            meleeAimbotEnabled = meleeAimbotCheckbox.checked;
        });
    });
    // Aimbot Function
    function aimbot() {
        if (aimbotEnabled) {
            let closestEnemy = null;
            let closestDistance = Infinity;

            // Find the closest enemy within the player's view
            unsafeWindow.players.forEach(player => {
                if (player.team !== unsafeWindow.activePlayer.team) {
                    // Check if the enemy is on screen
                    const distance = Math.sqrt(Math.pow(unsafeWindow.activePlayer.x - player.x, 2) + Math.pow(unsafeWindow.activePlayer.y - player.y, 2));
                    const screenBounds = {
                        top: 0,
                        left: 0,
                        right: window.innerWidth,
                        bottom: window.innerHeight
                    };

                    // Check if the enemy is within screen bounds
                    if (player.x > screenBounds.left && player.x < screenBounds.right && player.y > screenBounds.top && player.y < screenBounds.bottom) {
                        if (distance < closestDistance) {
                            closestDistance = distance;
                            closestEnemy = player;
                        }
                    }
                }
            });

            if (closestEnemy) {
                const angleToEnemy = Math.atan2(closestEnemy.y - unsafeWindow.activePlayer.y, closestEnemy.x - unsafeWindow.activePlayer.x);
                unsafeWindow.activePlayer.rotation = angleToEnemy;
                if (autoShootEnabled) {
                    // Auto shoot if enabled
                    unsafeWindow.activePlayer.shoot();
                }
            }
        }
    }
    // Spinbot Function
    function spinbot() {
        if (spinbotEnabled) {
            // Rotate the player character in a continuous spinning motion
            unsafeWindow.activePlayer.rotation += Math.PI / 180; // Rotate by 1 degree every frame
        }
    }
    // Melee Aimbot Function (Targets enemies within 50px distance)
    function meleeAimbot() {
        if (meleeAimbotEnabled) {
            let closestEnemy = null;
            let closestDistance = 50; // Distance threshold for melee aimbot

            // Find the closest enemy within the melee range
            unsafeWindow.players.forEach(player => {
                if (player.team !== unsafeWindow.activePlayer.team) {
                    const distance = Math.sqrt(Math.pow(unsafeWindow.activePlayer.x - player.x, 2) + Math.pow(unsafeWindow.activePlayer.y - player.y, 2));
                    if (distance < closestDistance) {
                        closestDistance = distance;
                        closestEnemy = player;
                    }
                }
            });

            if (closestEnemy) {
                const angleToEnemy = Math.atan2(closestEnemy.y - unsafeWindow.activePlayer.y, closestEnemy.x - unsafeWindow.activePlayer.x);
                unsafeWindow.activePlayer.rotation = angleToEnemy;
                unsafeWindow.activePlayer.shoot(); // Perform melee attack or shooting
            }
        }
    }
    // Main loop to update features every frame
    setInterval(() => {
        if (aimbotEnabled || meleeAimbotEnabled) {
            aimbot();
            meleeAimbot(); // Check for melee aimbot at the same time
        }
        if (spinbotEnabled) {
            spinbot();
        }
    }, 1000 / 60); // Update every 60 FPS

})(); // Closing the IIFE
(function () {
    // Optimize FPS performance in web-based games
    function optimizeFPS() {
        // Request animation frame to sync the FPS with the browser's refresh rate
        function loop() {
            // Remove unnecessary rendering/animations
            cancelAnimationFrame(loopID);
            loopID = requestAnimationFrame(loop);
        }

        let loopID = requestAnimationFrame(loop);

        // Reduce memory usage by disabling certain features that are not necessary
        function reduceMemoryUsage() {
            if (typeof window.performance !== 'undefined') {
                // Garbage collection is done automatically, but we can try to reduce memory-intensive operations
                window.performance.memory = null;
            }
        }

        // Automatically lower graphics or display settings based on current performance
        function adjustGraphicsSettings() {
            const fpsThreshold = 30; // If FPS is below this threshold, lower the settings
            let currentFPS = 0;

            // Calculate FPS (frames per second) in a more efficient way
            let frames = 0;
            let lastTime = performance.now();
            function calculateFPS() {
                frames++;
                let currentTime = performance.now();
                if (currentTime - lastTime >= 1000) {
                    currentFPS = frames;
                    frames = 0;
                    lastTime = currentTime;

                    if (currentFPS < fpsThreshold) {
                        // Reduce graphics (e.g., disable effects, lower resolution)
                        console.log("FPS is low, lowering graphics settings...");
                        // Example: Disable some graphical elements
                        document.body.style.background = "#000"; // Simple example to darken the screen
                    }
                }
            }

            setInterval(calculateFPS, 1000); // Check FPS every second
        }

        // Optimize the environment for performance
        function optimizeEnvironment() {
            // Disable unnecessary animations
            document.body.style.animation = 'none';
            document.body.style.transition = 'none';

            // Disable unnecessary JavaScript timers (e.g., setInterval, setTimeout)
            const originalSetInterval = window.setInterval;
            window.setInterval = function (callback, delay) {
                if (delay > 1000) { // If the interval is too fast, delay or disable it
                    return originalSetInterval(callback, 1000);
                }
                return originalSetInterval(callback, delay);
            };
        }

        // Reduce background tasks and optimize the browser for gaming
        function optimizeBrowser() {
            // Disable unused tabs or reduce background tasks
            const visibleTabs = [...document.querySelectorAll('iframe')];
            visibleTabs.forEach(tab => {
                tab.style.visibility = 'hidden'; // Hide any hidden iframe or background content
            });

            // Enable performance-enhancing modes like "requestAnimationFrame"
            window.requestAnimationFrame = (function () {
                return function (callback) {
                    setTimeout(callback, 1000 / 60); // Cap the FPS at 60
                };
            })();
        }

        // Start optimizations
        reduceMemoryUsage();
        adjustGraphicsSettings();
        optimizeEnvironment();
        optimizeBrowser();
    }

    // Execute the function for optimizing FPS and lag reduction
    optimizeFPS();
})();
(function () {
    // Optimizing the ping by reducing unnecessary network requests
    function optimizeNetworkRequests() {
        // Prevent automatic background refreshes
        const originalFetch = window.fetch;
        window.fetch = function (url, options) {
            // Log requests to see if there are unnecessary fetches
            console.log('Fetching:', url);

            // If the request is to an unnecessary endpoint, block it (this is just an example)
            if (url.includes('unnecessary_resource')) {
                return Promise.resolve(new Response(''));
            }

            // Otherwise, allow the fetch to proceed normally
            return originalFetch(url, options);
        };

        // Disable any unnecessary WebSocket connections or long-polling events
        const originalWebSocket = window.WebSocket;
        window.WebSocket = function (url, protocols) {
            // Block specific WebSocket connections (example)
            if (url.includes('unnecessary_socket')) {
                return null;
            }
            return new originalWebSocket(url, protocols);
        };

        // Reduce background network usage by blocking certain requests
        function blockUnwantedRequests() {
            const originalXMLHttpRequest = window.XMLHttpRequest;
            window.XMLHttpRequest = function () {
                const xhr = new originalXMLHttpRequest();
                const originalSend = xhr.send;
                xhr.send = function (body) {
                    // Block requests that aren't essential for gameplay
                    if (xhr._url.includes('unwanted_resource')) {
                        console.log('Blocking request:', xhr._url);
                        return; // Don't send this request
                    }
                    return originalSend.call(xhr, body);
                };
                return xhr;
            };
        }

        // Execute blocking function to minimize unnecessary traffic
        blockUnwantedRequests();
    }

    // Optimize the game environment by reducing unnecessary resource loading
    function optimizeResourceLoading() {
        // Disable unnecessary image, script, or video loading
        const originalImage = HTMLImageElement.prototype.src;
        HTMLImageElement.prototype.src = function (src) {
            if (src.includes('high_resolution_image')) {
                console.log('Blocking high-resolution image load:', src);
                return;
            }
            return originalImage.apply(this, arguments);
        };

        // Disable background processes that can increase latency
        function stopBackgroundTasks() {
            // Blocking certain animation or resource-intensive operations that may cause lag
            document.body.style.animation = 'none';
            document.body.style.transition = 'none';
        }

        stopBackgroundTasks();
    }

    // Reduce background process interference
    function manageBackgroundProcesses() {
        // Disable unused tabs or resources to reduce background interference
        const hiddenTabs = document.querySelectorAll('iframe');
        hiddenTabs.forEach(tab => {
            tab.style.visibility = 'hidden'; // Hide inactive tabs or iframes to reduce resources used
        });

        // Disable animations and transitions that could increase load and delay
        document.body.style.animation = 'none';
        document.body.style.transition = 'none';
    }

    // Improve the game experience by reducing unnecessary resources and improving connection handling
    function improveGameConnection() {
        // Automatically retry failed connections, ensuring more stable gameplay
        window.addEventListener('offline', () => {
            console.log('Connection lost, retrying...');
            // Try to reconnect when the connection is restored
            setTimeout(() => {
                location.reload();
            }, 5000);
        });

        // Retry any important game-related requests if they fail
        function retryFailedRequests() {
            const originalFetch = window.fetch;
            window.fetch = function (url, options) {
                return originalFetch(url, options).catch((error) => {
                    console.log('Fetch failed, retrying...', url);
                    // Retry the fetch after a delay
                    return new Promise((resolve) => {
                        setTimeout(() => resolve(fetch(url, options)), 2000);
                    });
                });
            };
        }

        retryFailedRequests();
    }

    // Initiate optimization functions
    function optimizePing() {
        optimizeNetworkRequests();
        optimizeResourceLoading();
        manageBackgroundProcesses();
        improveGameConnection();
    }

    // Run the ping optimization every 5 seconds to continuously adjust settings
    setInterval(optimizePing, 5000); // Check every 5 seconds to optimize the game

    console.log('Ping optimization started...');
})();
(function () {
    function showHealthPercentage(barElement, currentHealth, maxHealth) {
        if (!barElement || typeof currentHealth !== 'number' || typeof maxHealth !== 'number') return;

        const percentage = Math.round((currentHealth / maxHealth) * 100);

        let percentageText = barElement.querySelector('.health-percent');
        if (!percentageText) {
            percentageText = document.createElement('div');
            percentageText.className = 'health-percent';

            Object.assign(percentageText.style, {
                position: 'absolute',
                width: '100%',
                height: '100%',
                display: 'flex',
                alignItems: 'center',
                justifyContent: 'center',
                top: '0',
                left: '0',
                color: 'white',
                fontWeight: 'bold',
                fontSize: '14px',
                textShadow: '0 0 5px black',
                pointerEvents: 'none',
            });

            if (getComputedStyle(barElement).position === 'static') {
                barElement.style.position = 'relative';
            }

            barElement.appendChild(percentageText);
        }

        percentageText.textContent = `${percentage}%`;
    }

    // 🔁 Example auto-update loop (modify as needed)
    setInterval(() => {
        const healthBar = document.getElementById('health-bar');
        const player = unsafeWindow.activePlayer;

        if (player && healthBar) {
            showHealthPercentage(healthBar, player.health, player.maxHealth);
        }
    }, 200); // update every 200ms
})();
(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 () {
    // 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 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);
})();