WormVision Lite MAX – Full ESP + Aimbot UI (CloudSafe/Chromebook)

Chromebook-safe Fortnite ESP + Head Detection + FOV + Smooth Aimbot + Triggerbot | Runs on Xbox Cloud Gaming 🎯💻🧠

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         WormVision Lite MAX – Full ESP + Aimbot UI (CloudSafe/Chromebook)
// @namespace    http://wormgpt.blacklightrift
// @version      1.2
// @description  Chromebook-safe Fortnite ESP + Head Detection + FOV + Smooth Aimbot + Triggerbot | Runs on Xbox Cloud Gaming 🎯💻🧠
// @author       Worm
// @match        *://*.xbox.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    ///////////////////////////////
    // === UI & STYLE SYSTEM === //
    ///////////////////////////////

    const style = document.createElement('style');
    style.innerHTML = `
        .worm-ui {
            position: fixed;
            top: 20px;
            right: 20px;
            width: 280px;
            background: #0e0e12;
            border: 2px solid #8f00ff;
            border-radius: 12px;
            color: white;
            font-family: Arial, sans-serif;
            font-size: 14px;
            z-index: 999999;
            padding: 12px;
            box-shadow: 0 0 12px #8f00ff88;
            display: none;
        }
        .worm-ui h2 {
            margin: 0 0 10px;
            font-size: 16px;
            text-align: center;
            color: #BB86FC;
        }
        .worm-ui label {
            display: flex;
            justify-content: space-between;
            margin: 6px 0;
        }
        .worm-ui input[type=checkbox], .worm-ui input[type=range] {
            transform: scale(1.2);
        }
        .worm-overlay, .worm-head {
            position: fixed;
            z-index: 999998;
            pointer-events: none;
        }
        .worm-box {
            border: 2px solid lime;
            background: rgba(0, 255, 0, 0.1);
            border-radius: 4px;
        }
        .worm-head {
            width: 6px;
            height: 6px;
            background: red;
            border-radius: 50%;
        }
        .worm-fov {
            border: 2px dashed rgba(255, 0, 255, 0.6);
            border-radius: 50%;
        }
    `;
    document.head.appendChild(style);

    const uiHTML = `
        <div class="worm-ui" id="wormMenu">
            <h2>🧠 WormVision Lite MAX</h2>
            <label>ESP <input type="checkbox" id="esp-toggle"></label>
            <label>Triggerbot <input type="checkbox" id="trigger-toggle"></label>
            <label>Soft Aim <input type="checkbox" id="aim-toggle"></label>
            <label>FOV Overlay <input type="checkbox" id="fov-toggle"></label>
            <label>Aim Smooth<input type="range" id="smooth-slider" min="1" max="10" value="4"></label>
        </div>
    `;
    document.body.insertAdjacentHTML('beforeend', uiHTML);
    const menu = document.getElementById('wormMenu');

    // === Toggle Menu With Ctrl+Alt+G+3
    let buffer = [];
    window.addEventListener('keydown', e => {
        buffer.push(e.key.toLowerCase());
        if (buffer.length > 5) buffer.shift();
        if (buffer.join('-').includes('control-alt-g-3')) {
            menu.style.display = menu.style.display === 'none' ? 'block' : 'none';
            buffer = [];
        }
    });

    ///////////////////////////
    // === STATE + LOGIC === //
    ///////////////////////////

    const config = {
        esp: false,
        triggerbot: false,
        aim: false,
        fov: false,
        smoothness: 4,
        aimKey: 'f',
        aimRadius: 100,
    };

    document.getElementById('esp-toggle').addEventListener('change', e => config.esp = e.target.checked);
    document.getElementById('trigger-toggle').addEventListener('change', e => config.triggerbot = e.target.checked);
    document.getElementById('aim-toggle').addEventListener('change', e => config.aim = e.target.checked);
    document.getElementById('fov-toggle').addEventListener('change', e => config.fov = e.target.checked);
    document.getElementById('smooth-slider').addEventListener('input', e => config.smoothness = parseInt(e.target.value));

    let aimX = 0, aimY = 0;

    function drawESP(x, y, w, h, scaleX, scaleY) {
        const box = document.createElement('div');
        box.className = 'worm-overlay worm-box';
        box.style.left = `${x * scaleX}px`;
        box.style.top = `${y * scaleY}px`;
        box.style.width = `${w * scaleX}px`;
        box.style.height = `${h * scaleY}px`;
        document.body.appendChild(box);
        setTimeout(() => box.remove(), 80);
    }

    function drawHead(x, y, scaleX, scaleY) {
        const dot = document.createElement('div');
        dot.className = 'worm-head';
        dot.style.left = `${x * scaleX}px`;
        dot.style.top = `${y * scaleY}px`;
        document.body.appendChild(dot);
        setTimeout(() => dot.remove(), 80);
    }

    function drawFOV() {
        const fov = document.createElement('div');
        const size = config.aimRadius * 2;
        fov.className = 'worm-overlay worm-fov';
        fov.style.width = `${size}px`;
        fov.style.height = `${size}px`;
        fov.style.left = `calc(50% - ${config.aimRadius}px)`;
        fov.style.top = `calc(50% - ${config.aimRadius}px)`;
        document.body.appendChild(fov);
        setTimeout(() => fov.remove(), 80);
    }

    ///////////////////////////////
    // === VISION / AIM ENGINE ===
    ///////////////////////////////

    function lerp(a, b, t) {
        return a + (b - a) * t;
    }

    function scanFrame() {
        const video = document.querySelector('video');
        if (!video || video.videoWidth === 0) return;

        const canvas = document.createElement('canvas');
        canvas.width = video.videoWidth;
        canvas.height = video.videoHeight;
        const ctx = canvas.getContext('2d');

        try {
            ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
            const pixels = ctx.getImageData(0, 0, canvas.width, canvas.height).data;
            const centerX = canvas.width / 2;
            const centerY = canvas.height / 2;
            const targets = [];

            for (let y = 0; y < canvas.height; y += 6) {
                for (let x = 0; x < canvas.width; x += 6) {
                    const idx = (y * canvas.width + x) * 4;
                    const r = pixels[idx], g = pixels[idx + 1], b = pixels[idx + 2];

                    if ((r > 200 && g < 80 && b < 80) || (r > 200 && g > 200 && b > 200)) {
                        targets.push({ x, y });
                    }
                }
            }

            const clusters = groupByProximity(targets, 40);
            const scaleX = window.innerWidth / canvas.width;
            const scaleY = window.innerHeight / canvas.height;
            let best = null;
            let bestDist = Infinity;

            clusters.forEach(cluster => {
                const minX = Math.min(...cluster.map(p => p.x));
                const minY = Math.min(...cluster.map(p => p.y));
                const maxX = Math.max(...cluster.map(p => p.x));
                const maxY = Math.max(...cluster.map(p => p.y));

                const width = maxX - minX;
                const height = maxY - minY;
                const headX = minX + width / 2;
                const headY = minY;

                if (config.esp) drawESP(minX, minY, width, height, scaleX, scaleY);
                if (config.esp) drawHead(headX, headY, scaleX, scaleY);

                const dx = headX - centerX;
                const dy = headY - centerY;
                const dist = Math.sqrt(dx * dx + dy * dy);

                if (dist < bestDist && dist < config.aimRadius) {
                    best = { dx, dy };
                    bestDist = dist;
                }
            });

            // Triggerbot
            if (config.triggerbot) {
                const mid = ctx.getImageData(centerX, centerY, 1, 1).data;
                if (mid[0] > 200 && mid[1] < 80 && mid[2] < 80) {
                    document.dispatchEvent(new KeyboardEvent('keydown', { key: config.aimKey, bubbles: true }));
                    document.dispatchEvent(new KeyboardEvent('keyup', { key: config.aimKey, bubbles: true }));
                }
            }

            // Aim assist
            if (config.aim && best) {
                aimX = lerp(aimX, best.dx, 1 / config.smoothness);
                aimY = lerp(aimY, best.dy, 1 / config.smoothness);
                window.dispatchEvent(new MouseEvent('mousemove', {
                    movementX: aimX / 4,
                    movementY: aimY / 4,
                    bubbles: true
                }));
            }

            if (config.fov) drawFOV();

        } catch (err) {
            // Ignore CORS errors
        }
    }

    function groupByProximity(points, threshold = 40) {
        const groups = [];
        points.forEach(p => {
            let added = false;
            for (let g of groups) {
                if (g.some(q => Math.hypot(p.x - q.x, p.y - q.y) < threshold)) {
                    g.push(p);
                    added = true;
                    break;
                }
            }
            if (!added) groups.push([p]);
        });
        return groups.filter(g => g.length > 5);
    }

    setInterval(scanFrame, 70);
})();