BloxdAura

KillAura for bloxd.io

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         BloxdAura
// @namespace    bloxd-aura
// @version      1.0.0
// @description  KillAura for bloxd.io
// @author       pentest
// @match        https://*.bloxd.io/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';

    let settings = {
        enabled: false,
        range: 6,
        attackSpeed: 150, // ms between attacks
        attackKey: 'R'    // toggle key
    };

    // UI
    let uiContainer = null;
    let statusDot = null;
    let toggleBtn = null;

    // Internal refs
    let gameAPI = null;
    let lastAttackTime = 0;
    let auraInterval = null;
    let targetScanInterval = null;
    let currentTarget = null;
    let initialized = false;

    // ─── Find game internals dynamically ────────────────────────────
    function findGameAPI() {
        // Try multiple paths to find the game's internal API
        // Using the bloxd global object that the game exposes
        if (window.bloxd && window.bloxd.noa) {
            let noa = window.bloxd.noa;
            // Check for entity system
            if (noa.entities) {
                return { noa, bloxd: window.bloxd };
            }
        }
        // Fallback: traverse game canvas
        if (window.gameInstance && window.gameInstance.noa) {
            return { noa: window.gameInstance.noa, bloxd: window.gameInstance };
        }
        return null;
    }

    // ─── Entity discovery ──────────────────────────────────────────
    function getOtherPlayers() {
        if (!gameAPI) return [];
        try {
            let players = [];
            let state = gameAPI.noa.entities.getState();
            if (!state) return [];

            let myId = gameAPI.bloxd.playerId || 1;

            for (let [eid, entity] of Object.entries(state)) {
                if (!entity || eid == myId) continue;
                
                // Check if it's a player (has position, is alive)
                if (entity.position && entity.breath !== undefined) {
                    players.push({
                        eid: parseInt(eid),
                        entity: entity,
                        pos: entity.position
                    });
                }
            }
            return players;
        } catch(e) {
            return [];
        }
    }

    function distanceTo(pos) {
        if (!gameAPI || !gameAPI.noa) return Infinity;
        try {
            let cam = gameAPI.noa.camera;
            if (!cam) return Infinity;
            let dx = pos[0] - cam[0],
                dy = pos[1] - cam[1],
                dz = pos[2] - cam[2];
            return Math.sqrt(dx*dx + dy*dy + dz*dz);
        } catch(e) {
            return Infinity;
        }
    }

    // ─── Attack ───────────────────────────────────────────────────
    function attackEntity(eid) {
        if (!gameAPI) return false;
        try {
            let noa = gameAPI.noa;
            
            // Method 1: Direct entity attack if available
            if (noa.entities && typeof noa.entities.doAttack === 'function') {
                noa.entities.doAttack(eid);
                return true;
            }
            
            // Method 2: Look for attack on the specific entity
            let state = noa.entities.getState();
            if (state && state[eid]) {
                let ent = state[eid];
                if (typeof ent.doAttack === 'function') {
                    ent.doAttack(eid);
                    return true;
                }
                // Check breakingItem chain
                if (ent.breakingItem && typeof ent.breakingItem.doAttack === 'function') {
                    ent.breakingItem.doAttack(eid);
                    return true;
                }
            }
            
            // Method 3: Try the game's internal attack method through the container
            if (noa.entities._eidData && noa.entities._eidData[eid]) {
                let data = noa.entities._eidData[eid];
                if (data.mesh && data.mesh.doAttack) {
                    data.mesh.doAttack(eid);
                    return true;
                }
            }

            // Method 4: Send through game container
            let ecs = noa.entities;
            if (ecs.attackEntity) {
                ecs.attackEntity(eid);
                return true;
            }

            return false;
        } catch(e) {
            return false;
        }
    }

    function findAndAttackBestTarget() {
        if (!gameAPI || !settings.enabled) return;
        
        let now = Date.now();
        if (now - lastAttackTime < settings.attackSpeed) return;

        let players = getOtherPlayers();
        if (!players.length) return;

        let best = null;
        let bestDist = settings.range;

        for (let p of players) {
            let d = distanceTo(p.pos);
            if (d < bestDist) {
                bestDist = d;
                best = p;
            }
        }

        if (best) {
            currentTarget = best;
            lastAttackTime = now;
            attackEntity(best.eid);
        } else {
            currentTarget = null;
        }
    }

    // ─── UI ────────────────────────────────────────────────────────
    function createUI() {
        if (uiContainer) return;

        uiContainer = document.createElement('div');
        uiContainer.id = 'bloxd-aura-ui';
        uiContainer.style.cssText = `
            position: fixed; top: 8px; right: 8px; z-index: 999999;
            font-family: 'Segoe UI', Arial, sans-serif;
            background: rgba(10,10,10,0.85);
            border: 1px solid rgba(255,255,255,0.1);
            border-radius: 8px;
            padding: 10px 14px;
            color: #eee;
            font-size: 13px;
            user-select: none;
            backdrop-filter: blur(4px);
            min-width: 160px;
            pointer-events: auto;
        `;

        // Header row
        let header = document.createElement('div');
        header.style.cssText = 'display:flex;align-items:center;gap:8px;margin-bottom:6px;font-weight:600;';

        statusDot = document.createElement('span');
        statusDot.style.cssText = `
            display:inline-block;width:10px;height:10px;border-radius:50%;
            background:#666;transition:background 0.2s;
        `;

        let title = document.createElement('span');
        title.textContent = 'Aura';

        let keyHint = document.createElement('span');
        keyHint.style.cssText = 'font-size:10px;color:#888;margin-left:auto;';
        keyHint.textContent = `[${settings.attackKey}]`;

        header.appendChild(statusDot);
        header.appendChild(title);
        header.appendChild(keyHint);

        // Info row
        let info = document.createElement('div');
        info.style.cssText = 'font-size:11px;color:#999;';
        info.textContent = '±' + settings.range + 'm';

        uiContainer.appendChild(header);
        uiContainer.appendChild(info);

        // Toggle on click
        uiContainer.addEventListener('click', function(e) {
            e.stopPropagation();
            toggle();
        });

        document.body.appendChild(uiContainer);
    }

    function updateUI() {
        if (!statusDot) return;
        if (settings.enabled) {
            statusDot.style.background = '#ff4444';
            statusDot.style.boxShadow = '0 0 6px #ff4444';
        } else {
            statusDot.style.background = '#666';
            statusDot.style.boxShadow = 'none';
        }
    }

    // ─── Control ───────────────────────────────────────────────────
    function enable() {
        settings.enabled = true;
        updateUI();
        
        if (targetScanInterval) clearInterval(targetScanInterval);
        if (auraInterval) clearInterval(auraInterval);

        // Scan for targets and attack on a timer
        auraInterval = setInterval(() => {
            findAndAttackBestTarget();
        }, Math.min(settings.attackSpeed, 100));
    }

    function disable() {
        settings.enabled = false;
        if (auraInterval) {
            clearInterval(auraInterval);
            auraInterval = null;
        }
        if (targetScanInterval) {
            clearInterval(targetScanInterval);
            targetScanInterval = null;
        }
        currentTarget = null;
        updateUI();
    }

    function toggle() {
        if (settings.enabled) {
            disable();
        } else {
            enable();
        }
    }

    // ─── Keybind ───────────────────────────────────────────────────
    function onKeyDown(e) {
        if (e.key.toUpperCase() === settings.attackKey && 
            !e.ctrlKey && !e.altKey && !e.metaKey &&
            !e.target.matches('input, textarea, [contenteditable]')) {
            e.preventDefault();
            toggle();
        }
    }

    // ─── Init ──────────────────────────────────────────────────────
    function init() {
        if (initialized) return;

        // Try to find game API immediately
        gameAPI = findGameAPI();

        if (!gameAPI) {
            // Wait for game to load — poll
            let attempts = 0;
            let h = setInterval(() => {
                attempts++;
                gameAPI = findGameAPI();
                if (gameAPI || attempts > 30) {
                    clearInterval(h);
                    if (gameAPI) {
                        initialized = true;
                        setup();
                    }
                }
            }, 500);
            return;
        }

        initialized = true;
        setup();
    }

    function setup() {
        createUI();
        updateUI();
        document.addEventListener('keydown', onKeyDown);
        console.log('[Aura] Ready — press ' + settings.attackKey + ' to toggle');
    }

    // Start
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

    // Expose for debugging
    window.__aura = {
        toggle,
        enable,
        disable,
        getSettings: () => ({...settings}),
        setRange: (r) => { settings.range = Math.max(1, Math.min(20, r)); },
        setSpeed: (s) => { settings.attackSpeed = Math.max(50, Math.min(1000, s)); }
    };

})();