Capture Client v1.0

Access local variables and more fun features. Shift + L for variable manager, Shift + Y for tweaks. Hook by ginger

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Advertisement:

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

Advertisement:

// ==UserScript==
// @name         Capture Client v1.0
// @version      1.0
// @description  Access local variables and more fun features. Shift + L for variable manager, Shift + Y for tweaks. Hook by ginger
// @author       Цветочек Кактус (timofeycacti) & AI
// @match        https://*.bloxd.io/*
// @namespace    CaptureClient
// @license      CC-BY-2.0
// @icon         https://i.postimg.cc/XJFnxv3m/Capture-Client-v1-(3).png
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let font = document.createElement('link');
    font.href = 'https://fonts.googleapis.com/css2?family=Lobster&display=swap';
    font.rel = 'stylesheet';
    document.head.appendChild(font);

    let style = document.createElement('style');
    style.textContent = `
    @keyframes spin{to{transform:rotate(360deg)}}
    .Crosshair{display:inline-block;animation:spin 1s linear infinite}
    @keyframes hudRotate { from { background-position: 0% 50%; } to { background-position: 100% 50%; } }
    @keyframes flash { 0%, 100% { color:#FFF176 } 50% { color:#660000 } }
    .changed { animation: flash 0.4s ease }
    .vm-item { padding:3px 4px; cursor:pointer; color:#FFF176; white-space:pre-wrap; word-break:break-word; user-select: none; }
    .vm-item:hover { color:#FFFFFF; background:rgba(255,255,255,0.08); }
    .btn { background: rgba(255, 241, 118, 0.15); color: #FFF176; border: 1px solid #FFF176; padding: 5px; margin: 5px 0; text-align: center; cursor: pointer; font-family: monospace; font-weight: bold; user-select: none; transition: background 0.2s, color 0.2s; }
    .btn:hover { background: #FFF176; color: #330000; }
    .btn.active { background: rgba(76, 175, 80, 0.3); color: #4CAF50; border-color: #4CAF50; }
    .btn.active:hover { background: #4CAF50; color: #fff; border-color: #4CAF50; }
    .vm-search-box { display: flex; padding: 4px; background: rgba(0,0,0,0.4); border-bottom: 1px solid rgba(255, 241, 118, 0.3); gap: 4px; }
    .vm-input { flex: 1; background: rgba(0,0,0,0.6); border: 1px solid #FFF176; color: #FFF176; font-family: monospace; font-size: 12px; padding: 2px 4px; outline: none; }
    .vm-checkbox-label { color: #FFF176; font-family: monospace; font-size: 11px; display: flex; align-items: center; gap: 3px; cursor: pointer; user-select: none; }
    .vm-checkbox-label input { cursor: pointer; accent-color: #FFF176; margin: 0; }
    `;
    document.head.appendChild(style);

    let vmOpen = false, vmBox, vmPath = [], vmCurrent;
    let tweaksOpen = false, tweaksBox;
    let vmSearchQuery = '', vmDeepSearchEnabled = false;
    let tracked = JSON.parse(localStorage.getItem('capture_tracked') || '{}');
    let lastValues = {};

    function saveTracked() {
        localStorage.setItem('capture_tracked', JSON.stringify(tracked));
    }

    function makeDraggable(header, box) {
        let isDown = false, ox = 0, oy = 0;
        header.addEventListener('mousedown', e => {
            isDown = true;
            ox = e.clientX - box.offsetLeft;
            oy = e.clientY - box.offsetTop;
        });
        document.addEventListener('mousemove', e => {
            if (isDown) {
                box.style.left = (e.clientX - ox) + 'px';
                box.style.top = (e.clientY - oy) + 'px';
            }
        });
        document.addEventListener('mouseup', () => { isDown = false; });
    }

    let trackerBox = document.createElement('div');
    Object.assign(trackerBox.style, {
        position: 'fixed', right: '10px', bottom: '10px', color: '#FFF176',
        fontFamily: 'monospace', fontSize: '12px', zIndex: 99999,
        textAlign: 'right', pointerEvents: 'none', maxWidth: '300px', wordBreak: 'break-word'
    });
    document.body.appendChild(trackerBox);

    function getSafeValue(obj, key) {
        try { return (obj && typeof obj === 'object') ? obj[key] : undefined; } catch { return undefined; }
    }

    setInterval(() => {
        trackerBox.innerHTML = '';
        Object.entries(tracked).forEach(([pathStr, path]) => {
            try {
                let val = path.reduce((o, k) => getSafeValue(o, k), window.Captured);
                let line = document.createElement('div');
                line.textContent = `${pathStr}: ${val}`;
                if (lastValues[pathStr] !== undefined && lastValues[pathStr] !== val) {
                    line.classList.add('changed');
                }
                lastValues[pathStr] = val;
                trackerBox.appendChild(line);
            } catch {}
        });
    }, 200);

    function setValue(path, val) {
        try {
            let obj = path.slice(0, -1).reduce((o, k) => getSafeValue(o, k), window.Captured);
            let key = path[path.length - 1];
            obj[key] = val;
            if (obj[key] !== val) {
                Object.defineProperty(obj, key, { value: val, writable: true, configurable: true, enumerable: true });
            }
        } catch {}
    }

    function createVmItem(displayKey, value, itemPath) {
        let item = document.createElement('div');
        item.className = 'vm-item';
        let pathStr = itemPath.join('.');

        item.textContent = value === null ? `${displayKey} : null` : typeof value === 'object' ? `${displayKey} >` : `${displayKey} : ${value}`;

        let handleTrack = (e) => {
            e.preventDefault(); e.stopPropagation();
            tracked[pathStr] ? delete tracked[pathStr] : tracked[pathStr] = itemPath;
            saveTracked();
        };

        item.onclick = (e) => {
            if (e.shiftKey) return handleTrack(e);
            e.preventDefault(); e.stopPropagation();

            if (value && typeof value === 'object') {
                vmPath = [...itemPath];
                vmUpdate();
            } else if (typeof value === 'boolean') {
                setValue(itemPath, !value);
                vmUpdate();
            } else {
                let input = prompt(`Set ${pathStr}`, value);
                if (input !== null) {
                    setValue(itemPath, typeof value === 'number' ? Number(input) : input);
                    vmUpdate();
                }
            }
        };

        item.oncontextmenu = e => { if (e.shiftKey) handleTrack(e); };
        return item;
    }

    function vmRender() {
        let box = vmBox._content;
        box.innerHTML = '';

        if (vmPath.length) {
            let back = document.createElement('div');
            back.textContent = '[..]';
            back.className = 'vm-item';
            back.onclick = (e) => { e.preventDefault(); e.stopPropagation(); vmPath.pop(); vmUpdate(); };
            box.appendChild(back);
        }

        let query = vmSearchQuery.toLowerCase().trim();

        if (query && vmDeepSearchEnabled) {
            let results = [], visited = new Set();
            (function search(obj, currentFullPath, depth = 0) {
                if (depth > 4 || !obj || typeof obj !== 'object' || visited.has(obj)) return;
                visited.add(obj);
                try {
                    Object.keys(obj).forEach(k => {
                        let p = [...currentFullPath, k];
                        if (k.toLowerCase().includes(query)) results.push({ keyPath: p, val: getSafeValue(obj, k) });
                        if (obj[k] && typeof obj[k] === 'object') search(obj[k], p, depth + 1);
                    });
                } catch {}
            })(vmCurrent, [...vmPath]);

            if (!results.length) {
                let empty = document.createElement('div');
                Object.assign(empty, { className: 'vm-item', textContent: 'No results found...' });
                empty.style.color = '#660000';
                box.appendChild(empty);
            } else {
                results.forEach(res => box.appendChild(createVmItem(res.keyPath.slice(vmPath.length).join('.'), res.val, res.keyPath)));
            }
        } else {
            Object.keys(vmCurrent || {}).forEach(k => {
                if (!query || k.toLowerCase().includes(query)) {
                    box.appendChild(createVmItem(k, getSafeValue(vmCurrent, k), [...vmPath, k]));
                }
            });
        }
    }

    function vmUpdate() {
        try { vmCurrent = vmPath.reduce((o, k) => getSafeValue(o, k), window.Captured); }
        catch { vmPath = []; vmCurrent = window.Captured; }
        vmRender();
    }

    function setupUiIsolation(el) {
        ['mousedown', 'mouseup', 'click', 'contextmenu'].forEach(evt => {
            el.addEventListener(evt, e => {
                if (!e.target.closest('[style*="cursor: move"]') && !e.shiftKey) e.stopPropagation();
            });
        });
    }

    function vmToggle() {
        vmOpen = !vmOpen;
        if (vmOpen) {
            vmBox = document.createElement('div');
            Object.assign(vmBox.style, {
                position: 'fixed', top: '20px', left: '20px', width: '320px', color: '#FFF176', zIndex: 99999,
                border: '2px solid #FFF176', background: 'linear-gradient(270deg,#330000,#000,#330000)',
                backgroundSize: '400% 400%', animation: 'hudRotate 8s linear infinite', display: 'flex', flexDirection: 'column'
            });

            let header = document.createElement('div');
            header.textContent = 'Capture Client';
            Object.assign(header.style, { background: '#FFF176', color: '#330000', padding: '5px', cursor: 'move', textAlign: 'center', fontFamily: 'Lobster' });

            let searchBar = document.createElement('div');
            searchBar.className = 'vm-search-box';

            let input = document.createElement('input');
            Object.assign(input, { type: 'text', className: 'vm-input', placeholder: 'Search properties...', value: vmSearchQuery });
            ['keydown', 'keyup', 'keypress'].forEach(evt => input.addEventListener(evt, e => e.stopPropagation()));
            input.addEventListener('input', e => { vmSearchQuery = e.target.value; vmRender(); });

            let label = document.createElement('label');
            label.className = 'vm-checkbox-label';
            let checkbox = document.createElement('input');
            Object.assign(checkbox, { type: 'checkbox', checked: vmDeepSearchEnabled });
            checkbox.addEventListener('change', e => { vmDeepSearchEnabled = e.target.checked; vmRender(); });
            label.append(checkbox, "Deep");
            searchBar.append(input, label);

            let content = document.createElement('div');
            Object.assign(content.style, { padding: '5px', overflow: 'auto', maxHeight: '320px', fontFamily: 'monospace' });

            vmBox.append(header, searchBar, content);
            document.body.appendChild(vmBox);
            vmBox._content = content;
            vmPath = []; vmUpdate();
            makeDraggable(header, vmBox);
            setupUiIsolation(vmBox);
        } else vmBox.remove();
    }

    const tweaksConfig = {
        allCraft: {
            name: 'All Craft',
            type: 'action',
            callback: () => {
                try {
                    Object.values(window.Captured.bloxd.craftingManager.playerRecipes[1] || {}).forEach(arr => {
                        if (Array.isArray(arr)) arr.forEach(o => { if (o) delete o.station; });
                    });
                } catch {}
            }
        },
        defineAll: {
            name: 'Define All',
            type: 'action',
            callback: () => {
                try {
                    let visited = new Set();
                    let found = (function search(obj, depth = 0) {
                        if (depth > 4 || !obj || typeof obj !== 'object' || visited.has(obj)) return null;
                        visited.add(obj);
                        if (obj.hasOwnProperty('playerZoom')) return obj;
                        for (let key of Object.keys(obj)) {
                            try {
                                let res = search(obj[key], depth + 1);
                                if (res) return res;
                            } catch {}
                        }
                        return null;
                    })(window.Captured);
                    if (found) {
                        window.Captured.cBloxdStats = found;
                        if (vmOpen) vmUpdate();
                    }
                } catch {}
            }
        },
        resetAcc: {
            name: 'Reset Acc',
            type: 'action',
            callback: () => {
                try {
                    let domains = [".bloxd.io", location.hostname, ""];
                    domains.forEach(d => {
                        document.cookie = `__Secure-3PSIDMC=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;${d ? ` domain=${d};` : ''} Secure; SameSite=None`;
                    });
                    location.reload();
                } catch {}
            }
        }
    };

    function renderTweaks() {
        let content = tweaksBox._content;
        content.innerHTML = '';
        Object.keys(tweaksConfig).forEach(key => {
            let tweak = tweaksConfig[key];
            let btn = document.createElement('div');
            btn.className = 'btn';
            btn.textContent = tweak.type === 'boolean' ? `${tweak.name}: ${tweak.enabled ? 'ON' : 'OFF'}` : tweak.name;
            if (tweak.type === 'boolean' && tweak.enabled) btn.classList.add('active');

            btn.onclick = (e) => {
                e.preventDefault(); e.stopPropagation();
                if (tweak.type === 'boolean') {
                    tweak.enabled = !tweak.enabled;
                    tweak.callback(tweak.enabled);
                    renderTweaks();
                } else tweak.callback();
            };
            content.appendChild(btn);
        });
    }

    function tweaksToggle() {
        tweaksOpen = !tweaksOpen;
        if (tweaksOpen) {
            tweaksBox = document.createElement('div');
            Object.assign(tweaksBox.style, {
                position: 'fixed', top: '20px', right: '20px', width: '220px', color: '#FFF176', zIndex: 99999,
                border: '2px solid #FFF176', background: 'linear-gradient(270deg,#330000,#000,#330000)',
                backgroundSize: '400% 400%', animation: 'hudRotate 8s linear infinite', display: 'flex', flexDirection: 'column'
            });

            let header = document.createElement('div');
            header.textContent = 'Tweaks';
            Object.assign(header.style, { background: '#FFF176', color: '#330000', padding: '5px', cursor: 'move', textAlign: 'center', fontFamily: 'Lobster' });

            let content = document.createElement('div');
            content.style.padding = '5px';
            tweaksBox._content = content;
            tweaksBox.append(header, content);
            document.body.appendChild(tweaksBox);
            renderTweaks();
            makeDraggable(header, tweaksBox);
            setupUiIsolation(tweaksBox);
        } else tweaksBox.remove();
    }

    document.addEventListener('keydown', e => {
        if (e.target.tagName !== 'INPUT' && e.shiftKey) {
            if (e.code === 'KeyL') vmToggle();
            if (e.code === 'KeyY') tweaksToggle();
        }
    });

    let checker = setInterval(() => {
        try {
            let searchFiber = f => f?.memoizedState?.bloxd || searchFiber(f?.next);
            window.Captured = Object.values(searchFiber(Object.values(document.querySelector(".Crosshair"))[0].return.memoizedState))[2];
            clearInterval(checker);
            document.querySelector(".Crosshair").innerText = "x";
        } catch {}
    }, 1000);

})();