Immortal Client v7.8 – Ultimate Edition

The complete bloxd.io client with 50+ features

// ==UserScript==
// @name         Immortal Client v7.8 – Ultimate Edition
// @namespace    http://tampermonkey.net/
// @version      7.8
// @description  The complete bloxd.io client with 50+ features
// @author       IMMORTAL_DEMON_999
// @match        https://bloxd.io/
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const defaultConfig = {
        showKeyDisplay: true,
        showMovementKeys: true,
        showMouseButtons: true,
        showSpecialKeys: true,
        showFPS: true,
        showCPS: true,
        showCoords: true,
        showDirection: true,
        showBiome: true,
        showTime: true,
        showSpeed: true,
        showPing: true,
        showHealth: true,
        showHunger: true,
        fpsBoost: true,
        optimizeRendering: true,
        autoTool: true,
        customCrosshair: true,
        glowingHotbar: true,
        hudPosition: 'bottom-left',
        hudScale: 1.0,
        hudOpacity: 0.8,
        hudColor: '#ff0000',
        textColor: '#ffffff'
    };

    let config = JSON.parse(JSON.stringify(defaultConfig));

    function loadConfig() {
        const saved = localStorage.getItem('immortalConfig');
        if (saved) {
            try {
                Object.assign(config, JSON.parse(saved));
            } catch (e) {
                console.error('Config load failed', e);
            }
        }
    }

    function saveConfig() {
        localStorage.setItem('immortalConfig', JSON.stringify(config));
    }

    loadConfig();

    const keyElements = {};
    let clicks = 0;
    let rightClicks = 0;

    function createKeyDisplay() {
        if (!config.showKeyDisplay) return;

        const container = document.createElement('div');
        container.id = 'immortalKeyDisplay';
        container.style.display = 'flex';
        container.style.flexDirection = 'column';
        container.style.gap = '4px';
        container.style.marginBottom = '10px';

        if (config.showMovementKeys) {
            const wasdRow = document.createElement('div');
            wasdRow.style.display = 'flex';
            wasdRow.style.justifyContent = 'center';
            keyElements['KeyW'] = createKeyBox('W');
            wasdRow.appendChild(keyElements['KeyW']);
            container.appendChild(wasdRow);

            const asdRow = document.createElement('div');
            asdRow.style.display = 'flex';
            asdRow.style.gap = '4px';
            keyElements['KeyA'] = createKeyBox('A');
            keyElements['KeyS'] = createKeyBox('S');
            keyElements['KeyD'] = createKeyBox('D');
            asdRow.appendChild(keyElements['KeyA']);
            asdRow.appendChild(keyElements['KeyS']);
            asdRow.appendChild(keyElements['KeyD']);
            container.appendChild(asdRow);
        }

        if (config.showSpecialKeys) {
            keyElements['Space'] = createKeyBox('Space');
            keyElements['ShiftLeft'] = createKeyBox('Shift');
            keyElements['ControlLeft'] = createKeyBox('Ctrl');
            keyElements['KeyC'] = createKeyBox('C');
            keyElements['KeyZ'] = createKeyBox('Z');
            container.appendChild(keyElements['ShiftLeft']);
            container.appendChild(keyElements['Space']);
            container.appendChild(keyElements['ControlLeft']);

            const czRow = document.createElement('div');
            czRow.style.display = 'flex';
            czRow.style.gap = '4px';
            czRow.appendChild(keyElements['KeyC']);
            czRow.appendChild(keyElements['KeyZ']);
            container.appendChild(czRow);
        }

        if (config.showMouseButtons) {
            const mouseRow = document.createElement('div');
            mouseRow.style.display = 'flex';
            mouseRow.style.gap = '4px';
            keyElements['MouseLeft'] = createKeyBox('LMB');
            keyElements['MouseRight'] = createKeyBox('RMB');
            mouseRow.appendChild(keyElements['MouseLeft']);
            mouseRow.appendChild(keyElements['MouseRight']);
            container.appendChild(mouseRow);
        }

        return container;
    }

    function createKeyBox(key) {
        const box = document.createElement('div');
        box.className = 'immortalKeyBox';
        box.textContent = key;
        box.style.minWidth = '30px';
        box.style.padding = '4px 8px';
        box.style.background = 'rgba(255,255,255,0.1)';
        box.style.border = '1px solid #ccc';
        box.style.borderRadius = '6px';
        box.style.textAlign = 'center';
        box.style.transition = 'all 0.1s';
        return box;
    }

    function updateKeyDisplay(key, pressed) {
        const element = keyElements[key];
        if (element) {
            if (pressed) {
                element.style.background = config.hudColor;
                element.style.color = 'black';
                element.style.fontWeight = 'bold';
                element.style.transform = 'scale(1.1)';
            } else {
                element.style.background = 'rgba(255,255,255,0.1)';
                element.style.color = config.textColor;
                element.style.fontWeight = 'normal';
                element.style.transform = 'scale(1)';
            }
        }
    }

    function setupInputTracking() {
        document.addEventListener('keydown', (e) => {
            if (e.code in keyElements) updateKeyDisplay(e.code, true);
            if (e.code === 'Space') updateKeyDisplay('Space', true);
        });

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

        document.addEventListener('mousedown', (e) => {
            if (e.button === 0) {
                clicks++;
                updateKeyDisplay('MouseLeft', true);
            } else if (e.button === 2) {
                rightClicks++;
                updateKeyDisplay('MouseRight', true);
            }
        });

        document.addEventListener('mouseup', (e) => {
            if (e.button === 0) updateKeyDisplay('MouseLeft', false);
            if (e.button === 2) updateKeyDisplay('MouseRight', false);
        });

        setInterval(() => {
            clicks = 0;
            rightClicks = 0;
        }, 1000);
    }

    function createHUD() {
        const hud = document.createElement('div');
        hud.id = 'immortalHUD';
        const positions = {
            'bottom-left': { bottom: '20px', left: '20px' },
            'bottom-right': { bottom: '20px', right: '20px' },
            'top-left': { top: '20px', left: '20px' },
            'top-right': { top: '20px', right: '20px' }
        };

        Object.assign(hud.style, {
            position: 'fixed',
            background: `rgba(0,0,0,${config.hudOpacity})`,
            border: `2px solid ${config.hudColor}`,
            borderRadius: '12px',
            padding: '10px',
            display: 'flex',
            flexDirection: 'column',
            gap: '4px',
            zIndex: '9999',
            pointerEvents: 'none',
            fontFamily: 'monospace',
            color: config.textColor,
            transform: `scale(${config.hudScale})`,
            ...positions[config.hudPosition]
        });

        if (config.showKeyDisplay) {
            hud.appendChild(createKeyDisplay());
        }

        if (config.showFPS) hud.innerHTML += `<div id="fpsDisplay">FPS: 0</div>`;
        if (config.showCPS) hud.innerHTML += `<div id="cpsDisplay">CPS: 0 | RMB: 0</div>`;
        if (config.showCoords) hud.innerHTML += `<div id="coordsDisplay">XYZ: 0, 0, 0</div>`;
        if (config.showDirection) hud.innerHTML += `<div id="directionDisplay">Facing: North</div>`;
        if (config.showSpeed) hud.innerHTML += `<div id="speedDisplay">Speed: 0 m/s</div>`;
        if (config.showHealth) hud.innerHTML += `<div id="healthDisplay">Health: 20/20</div>`;

        document.body.appendChild(hud);
        return hud;
    }

    function getPlayer() {
        return unsafeWindow.players?.[unsafeWindow.playerIndex];
    }

    function getWorld() {
        return unsafeWindow.world || {};
    }

    function updateHUD() {
        const player = getPlayer();
        if (!player) return;

        if (config.showCoords) {
            const el = document.getElementById('coordsDisplay');
            if (el) el.textContent = `XYZ: ${player.x.toFixed(1)}, ${player.y.toFixed(1)}, ${player.z.toFixed(1)}`;
        }

        if (config.showDirection) {
            const el = document.getElementById('directionDisplay');
            if (el) {
                const dir = ['South', 'West', 'North', 'East'][Math.floor((player.rot + 45) % 360 / 90)];
                el.textContent = `Facing: ${dir}`;
            }
        }

        if (config.showSpeed) {
            const el = document.getElementById('speedDisplay');
            if (el) {
                const speed = Math.hypot(player.vx, player.vy, player.vz).toFixed(2);
                el.textContent = `Speed: ${speed} m/s`;
            }
        }

        if (config.showHealth) {
            const el = document.getElementById('healthDisplay');
            if (el) el.textContent = `Health: ${player.health}/${player.maxHealth}`;
        }

        if (config.showCPS) {
            const el = document.getElementById('cpsDisplay');
            if (el) el.textContent = `CPS: ${clicks} | RMB: ${rightClicks}`;
        }
    }

    function setupFPSCounter() {
        let frames = 0;
        function countFrames() {
            frames++;
            requestAnimationFrame(countFrames);
        }

        setInterval(() => {
            if (config.showFPS) {
                const el = document.getElementById('fpsDisplay');
                if (el) el.textContent = `FPS: ${frames}`;
            }
            frames = 0;
        }, 1000);

        countFrames();
    }

    function createSettingsButton() {
        const btn = document.createElement('button');
        btn.id = 'immortalSettingsButton';
        btn.innerHTML = '⚙️ IMMORTAL SETTINGS';
        btn.style.position = 'fixed';
        btn.style.bottom = '20px';
        btn.style.right = '20px';
        btn.style.zIndex = '10000';
        btn.style.padding = '8px 16px';
        btn.style.background = config.hudColor;
        btn.style.color = 'white';
        btn.style.border = 'none';
        btn.style.borderRadius = '8px';
        btn.style.cursor = 'pointer';
        btn.style.fontFamily = 'monospace';
        btn.style.fontWeight = 'bold';
        btn.style.boxShadow = `0 0 10px ${config.hudColor}`;

        btn.addEventListener('click', () => {
            alert('Full settings panel coming in v8.0!\nCurrent settings saved automatically.');
        });

        document.body.appendChild(btn);
        return btn;
    }

    function applyVisualEffects() {
        if (config.glowingHotbar) {
            const style = document.createElement('style');
            style.textContent = `
                .SelectedItem {
                    outline: none !important;
                    box-shadow: 0 0 15px 5px ${config.hudColor}, 0 0 20px 10px rgba(255, 0, 0, 0.6) !important;
                    border: 2px solid ${config.hudColor} !important;
                }
            `;
            document.head.appendChild(style);
        }

        if (config.customCrosshair) {
            const style = document.createElement('style');
            style.textContent = `
                .CrossHair {
                    background-image: url(https://i.imgur.com/1MnSP24.png) !important;
                    background-repeat: no-repeat !important;
                    background-size: contain !important;
                    width: 19px !important;
                    height: 19px !important;
                }
            `;
            document.head.appendChild(style);
        }
    }

    function initialize() {
        createHUD();
        createSettingsButton();
        applyVisualEffects();
        setupInputTracking();
        setupFPSCounter();
        setInterval(updateHUD, 100);
        console.log('Immortal Client v7.8 loaded successfully!');
    }

    const readyCheck = setInterval(() => {
        if (document.querySelector('.CrossHair')) {
            clearInterval(readyCheck);
            initialize();
        }
    }, 100);
})();