Smokin Hacks

Killaura + Auto-Spike

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         Smokin Hacks
// @namespace    https://bloxd.io
// @version      1.4
// @description  Killaura + Auto-Spike
// @license      No where
// @match        https://bloxd.io/*
// @match        https://staging.bloxd.io/*
// @match        https://www.bloxd.com/*
// @match        https://bloxd.com/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(() => {
    'use strict';

    const attempt = (fn, fb=null) => { try { return fn(); } catch(_) { return fb; } };
    const vals = o => Object.values(o ?? {});
    const ks   = o => Object.keys(o ?? {});

    const bloxd = {
        noa: null,
        _req: null,

        init() {
            const descs = Object.getOwnPropertyDescriptors(window);
            const ckey  = ks(descs).find(k => descs[k]?.set?.toString().includes('++'));
            if (!ckey || typeof window[ckey]?.push !== 'function') return;

            window[ckey].push([[Math.floor(Math.random() * 90000) + 10000], {}, req => {
                this._req = req;
                const mkeys = ks(req.m);
                for (let i = 0; i < mkeys.length; i++) {
                    try {
                        if (!req.m[mkeys[i]].toString().includes('nonBlocksClient:')) continue;
                        const mod   = req(mkeys[i]);
                        const props = vals(mod).find(e => e && typeof e === 'object');
                        const noa   = props && vals(props).find(e => e?.entities);
                        if (noa) { this.noa = noa; window.noa = noa; }
                        break;
                    } catch(_) {}
                }
            }]);
        }
    };

    const game = {
        _held: null,

        inGame()      { return !!(bloxd.noa?.bloxd?.client?.msgHandler); },
        getPos(id)    { return attempt(() => bloxd.noa.entities.getState(id, 'position').position); },
        getIds()      { return attempt(() => bloxd.noa?.bloxd?.getPlayerIds?.() ?? {}, {}); },

        getHeld(id=1) {
            if (!bloxd.noa) return null;
            if (!this._held) this._held = vals(bloxd.noa.entities).find(fn => {
                if (typeof fn !== 'function' || fn.length !== 1) return false;
                const s = fn.toString();
                return s.length < 80 && s.includes(').') && !s.includes('opWrapper');
            });
            return attempt(() => this._held?.(id));
        },

        doAttack(id) {
            attempt(() => {
                const item = this.getHeld(1);
                const fn   = item?.doAttack ?? item?.breakingItem?.doAttack;
                if (fn) fn.call(item, [0, 0, 0], id.toString(), 'HeadMesh');
            });
        },

        fireInput(action, down) {
            attempt(() => {
                const inp = bloxd.noa?.inputs; if (!inp) return;
                (down ? inp.down : inp.up)._events?.[action]?.(0);
            });
        },

        sendMsg(msg, color='#c084fc') {
            attempt(() => bloxd.noa?.bloxd?.client?.clientApi?.sendMessage?.(1, msg, { color }));
        }
    };

    class Mod {
        constructor(name, key) { this.name=name; this.key=key; this.enabled=false; this.btn=null; }
        toggle() {
            this.enabled = !this.enabled;
            this.onToggle(this.enabled);
            if (this.btn) {
                this.btn.classList.toggle('on', this.enabled);
            }
        }
        onToggle(_) {} onTick() {}
    }

    const modules = {
        killaura: new class extends Mod {
            constructor() {
                super('Killaura', 'KeyJ');
                this._last = 0;
                this.delay = 1;
                this.range = 7;
                this.multi = true;
            }
            onTick() {
                if (!game.inGame() || Date.now() - this._last < this.delay) return;
                const self = game.getPos(1); if (!self) return;

                for (const id of vals(game.getIds())) {
                    if (id == 1) continue;
                    const p = game.getPos(id); if (!p) continue;
                    if (Math.hypot(p[0]-self[0], p[1]-self[1], p[2]-self[2]) < this.range) {
                        this._last = Date.now();
                        game.doAttack(id);
                        if (!this.multi) break;
                    }
                }
            }
            onToggle(enabled) {
                if (enabled) {
                    game.sendMsg('⚡ Killaura enabled');
                } else {
                    game.sendMsg('⚡ Killaura disabled');
                }
            }
        }(),
        autoSpike: new class extends Mod {
            constructor() {
                super('Auto-Spike', 'KeyK');
                this._lastPlace = 0;
                this.placeDelay = 300;
                this.webFirst = true;
            }
            onTick() {
                if (!game.inGame() || Date.now() - this._lastPlace < this.placeDelay) return;
                const self = game.getPos(1); if (!self) return;

                const nearbyEnemies = vals(game.getIds()).filter(id => {
                    if (id == 1) return false;
                    const p = game.getPos(id);
                    if (!p) return false;
                    const dist = Math.hypot(p[0]-self[0], p[1]-self[1], p[2]-self[2]);
                    return dist < 15;
                });

                if (nearbyEnemies.length > 0) {
                    this._lastPlace = Date.now();

                    if (this.webFirst) {
                        game.fireInput('3', true);
                        setTimeout(() => game.fireInput('3', false), 50);
                    } else {
                        game.fireInput('4', true);
                        setTimeout(() => game.fireInput('4', false), 50);
                    }
                    this.webFirst = !this.webFirst;

                    setTimeout(() => {
                        game.fireInput('place', true);
                        setTimeout(() => game.fireInput('place', false), 50);
                    }, 100);
                }
            }
            onToggle(enabled) {
                if (enabled) {
                    game.sendMsg('🕷️ Auto-Spike enabled');
                } else {
                    game.sendMsg('🕷️ Auto-Spike disabled');
                }
            }
        }()
    };

    function buildUI() {
        if (document.getElementById('ch-root')) return;

        const css = document.createElement('style');
        css.textContent = `
            @import url('https://fonts.googleapis.com/css2?family=Teko:wght@700&family=Special+Elite&display=swap');

            #ch-root {
                position: fixed;
                top: 8px;
                left: 50%;
                transform: translateX(-50%);
                height: 42px;
                display: flex;
                align-items: center;
                gap: 0;
                background: #08001488;
                border: 1px solid #7c3aed;
                border-radius: 22px;
                font-family: 'Special Elite', monospace;
                font-size: 12px;
                color: #e2d9f3;
                z-index: 99999;
                box-shadow: 0 0 18px #7c3aed66, 0 2px 24px #00000088;
                user-select: none;
                transition: opacity .25s, transform .25s;
                backdrop-filter: blur(8px);
                padding: 0 12px;
                white-space: nowrap;
                overflow: visible;
                min-width: 920px;
            }
            #ch-root.hidden {
                opacity: 0;
                pointer-events: none;
                transform: translateX(-50%) translateY(-60px);
            }

            #ch-title {
                font-family: 'Teko', sans-serif;
                font-size: 17px;
                color: #c084fc;
                text-shadow: 0 0 10px #a855f7, 0 0 22px #7c3aed88;
                padding: 0 14px 0 10px;
                border-right: 1px solid #7c3aed55;
                letter-spacing: 1px;
            }

            .ch-div {
                width: 1px;
                height: 22px;
                background: #7c3aed44;
                margin: 0 4px;
            }

            .ch-btn {
                display: flex;
                align-items: center;
                gap: 6px;
                padding: 6px 14px;
                border-radius: 16px;
                border: 1px solid transparent;
                background: transparent;
                color: #6b7280;
                font-family: 'Special Elite', monospace;
                font-size: 12px;
                cursor: pointer;
                transition: all .18s;
                letter-spacing: 0.5px;
            }
            .ch-btn:hover {
                background: #3b076422;
                color: #c084fc;
                border-color: #7c3aed55;
            }
            .ch-btn.on {
                background: linear-gradient(135deg, #581c87aa, #3b0764aa);
                border-color: #a855f7;
                color: #f0abfc;
                box-shadow: 0 0 12px #a855f755;
            }
            .ch-key {
                font-size: 9px;
                color: #6d28d9;
                background: #0a0010;
                border: 1px solid #4c1d9577;
                border-radius: 4px;
                padding: 1px 5px;
                font-family: 'Special Elite', monospace;
            }
            .ch-btn.on .ch-key { color: #e879f9; border-color: #a855f7; }

            .ch-range-wrap {
                display: flex;
                align-items: center;
                gap: 6px;
                padding: 0 10px;
                color: #7c3aed;
                font-size: 11px;
                letter-spacing: 1px;
            }
            .ch-inp {
                background: #0d001a;
                border: 1px solid #4c1d95;
                border-radius: 8px;
                color: #e9d5ff;
                font-family: 'Special Elite', monospace;
                font-size: 11px;
                width: 46px;
                padding: 3px 6px;
                text-align: center;
                transition: all .15s;
            }
            .ch-inp:focus {
                outline: none;
                border-color: #a855f7;
                box-shadow: 0 0 8px #7c3aed66;
                color: #f0abfc;
            }

            .ch-chk {
                display: flex;
                align-items: center;
                gap: 5px;
                font-size: 11px;
                color: #7c3aed;
                cursor: pointer;
                padding: 0 10px;
            }
            .ch-chk input { accent-color: #a855f7; cursor: pointer; }
            .ch-chk:hover { color: #c084fc; }

            #ch-status {
                font-family: 'Special Elite', monospace;
                font-size: 10px;
                color: #3b0764;
                padding: 0 12px;
                letter-spacing: 1px;
                flex: 1;
                text-align: center;
            }
            #ch-status.on {
                color: #e879f9;
                text-shadow: 0 0 8px #a855f7;
            }

            .ch-hbtn {
                background: transparent;
                border: 1px solid #4c1d9566;
                color: #6d28d9;
                border-radius: 50%;
                width: 24px;
                height: 24px;
                cursor: pointer;
                font-size: 11px;
                display: flex;
                align-items: center;
                justify-content: center;
                transition: all .15s;
                padding: 0;
                font-family: monospace;
                flex-shrink: 0;
            }
            .ch-hbtn:hover {
                background: #7c3aed33;
                color: #e9d5ff;
                border-color: #a855f7;
                box-shadow: 0 0 8px #7c3aed88;
            }

            @keyframes glitch {
                0%,60%,100% { text-shadow: 0 0 10px #a855f7, 0 0 22px #7c3aed88; }
                20% { text-shadow: -2px 0 #f0abfc, 2px 0 #818cf8; }
                40% { text-shadow: 2px 0 #f0abfc, -2px 0 #818cf8; }
            }
            #ch-title:hover { animation: glitch .4s steps(1); cursor: default; }
        `;
        document.head.appendChild(css);

        const root = document.createElement('div');
        root.id = 'ch-root';
        root.innerHTML = `
            <span id="ch-title">👾 Smokin Hacks</span>
            <div class="ch-div"></div>
            <button class="ch-btn" id="ch-killaura">
                <span>Killaura</span>
                <span class="ch-key">J</span>
            </button>
            <div class="ch-div"></div>
            <button class="ch-btn" id="ch-autospike">
                <span>Auto-Spike</span>
                <span class="ch-key">K</span>
            </button>
            <div class="ch-div"></div>
            <div class="ch-range-wrap">
                <span>Range</span>
                <input class="ch-inp" id="ch-krange" type="number" min="1" max="20" step="0.5" value="7">
            </div>
            <div class="ch-div"></div>
            <label class="ch-chk">
                <input type="checkbox" id="ch-kmulti" checked> Multi
            </label>
            <div class="ch-div"></div>
            <span id="ch-status">waiting…</span>
            <div class="ch-div"></div>
            <button class="ch-hbtn" id="ch-hide" title="Hide (ShiftRight)">✕</button>
        `;
        document.body.appendChild(root);

        const kBtn = document.getElementById('ch-killaura');
        modules.killaura.btn = kBtn;
        kBtn.addEventListener('click', () => modules.killaura.toggle());

        const asBtn = document.getElementById('ch-autospike');
        modules.autoSpike.btn = asBtn;
        asBtn.addEventListener('click', () => modules.autoSpike.toggle());

        const bindInput = (id, cb) => {
            const el = document.getElementById(id);
            el.addEventListener('change', e => cb(+e.target.value || 0));
            el.addEventListener('focus',  () => attempt(() => { if (bloxd.noa?.inputs) bloxd.noa.inputs._paused = true; }));
            el.addEventListener('blur',   () => attempt(() => { if (bloxd.noa?.inputs) bloxd.noa.inputs._paused = false; }));
            el.addEventListener('keydown', e => e.stopPropagation(), true);
            el.addEventListener('keyup',   e => e.stopPropagation(), true);
        };
        bindInput('ch-krange', v => modules.killaura.range = Math.max(1, v));
        document.getElementById('ch-kmulti').addEventListener('change', e => modules.killaura.multi = e.target.checked);

        let visible = true;
        document.getElementById('ch-hide').addEventListener('click', () => {
            visible = false;
            root.classList.add('hidden');
        });

        document.addEventListener('keydown', e => {
            switch (e.code) {
                case 'ShiftRight': visible=!visible; root.classList.toggle('hidden', !visible); return;
                case 'KeyJ': modules.killaura.toggle(); return;
                case 'KeyK': modules.autoSpike.toggle(); return;
            }
        }, true);
    }

    function setStatus(msg, on) {
        const el = document.getElementById('ch-status'); if (!el) return;
        el.textContent = msg; el.className = on ? 'on' : '';
    }

    let inGame = false, announced = false;

    function rafLoop() {
        requestAnimationFrame(rafLoop);
        if (!inGame) return;
        attempt(() => vals(modules).forEach(m => { if (m.enabled) m.onTick(); }));
    }

    function watchGame() {
        setInterval(() => {
            const now = game.inGame();
            if (now && !inGame) {
                inGame = true; setStatus('● ONLINE', true);
                if (!announced) { game.sendMsg('👾 Smokin Hacks v1.4 — J=Killaura | K=Auto-Spike'); announced = true; }
            } else if (!now && inGame) {
                inGame = false; setStatus('awaiting game…', false);
            }
        }, 500);
    }

    let uiBuilt = false;

    function tryInit() {
        if (!window.noa) { bloxd.init(); return; }
        if (!uiBuilt) {
            uiBuilt = true;
            buildUI();
            watchGame();
            rafLoop();
        }
    }

    bloxd.init();

    const poll = setInterval(() => {
        tryInit();
        if (uiBuilt) clearInterval(poll);
    }, 250);

})();