BloxdAura

KillAura for bloxd.io

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==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)); }
    };

})();