Capture Client v1.0

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

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

Advertisement:

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

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);

})();