Greasy Fork is available in English.

MooMoo.io (Script Brasileiro [Brazillian Script])

Auto come quando HP <65% (pizza/cookie/food em slots 7/8/9). V=spike (slot6), F=trap(slot7), H=turret(slot8). Zoom wheel.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         MooMoo.io (Script Brasileiro [Brazillian Script])
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Auto come quando HP <65% (pizza/cookie/food em slots 7/8/9). V=spike (slot6), F=trap(slot7), H=turret(slot8). Zoom wheel.
// @author       Grok
// @match        *://moomoo.io/*
// @match        *://*.moomoo.io/*
// @grant        none
// @require      https://greasyfork.org/scripts/423602-msgpack/code/msgpack.js
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    let ws = null;
    let aimAngle = 0;
    let lastHp = 100;
    let eatCooldown = 0;
    let placeCooldown = 0;
    let canvas = null;
    let zoomLevel = 1;
    const MIN_ZOOM = 0.4;
    const MAX_ZOOM = 2.8;

    // Captura WebSocket
    const OldWebSocket = window.WebSocket;
    window.WebSocket = function(...args) {
        const inst = new OldWebSocket(...args);
        ws = inst;
        return inst;
    };
    window.WebSocket.prototype = OldWebSocket.prototype;

    function sendPacket(type, ...data) {
        if (!ws || ws.readyState !== WebSocket.OPEN) return false;
        try {
            const packet = msgpack.encode([type, ...data]);
            ws.send(packet);
            return true;
        } catch (e) {
            return false;
        }
    }

    function getCurrentSlot() {
        const items = document.getElementById('items');
        if (!items) return 0;
        const slots = items.querySelectorAll('div');
        for (let i = 0; i < slots.length; i++) {
            if (slots[i].classList.contains('selected')) return i;
        }
        return 0;
    }

    function eatSlot(slot) {
        const weaponSlot = getCurrentSlot();
        sendPacket('z', slot, false);
        setTimeout(() => sendPacket('F', 1), 10);
        setTimeout(() => sendPacket('F', 0), 30);
        if (weaponSlot !== slot) {
            setTimeout(() => sendPacket('z', weaponSlot, true), 50);
        }
    }

    function doAutoHeal() {
        if (eatCooldown > 0) return;
        // Tenta pizza(9), cookie(8), food(7) - Coloque neles!
        for (let slot of [9, 8, 7]) {
            eatSlot(slot);
            break; // Só tenta um por vez
        }
        eatCooldown = 12; // ~360ms cooldown
    }

    function place(slot) {
        if (placeCooldown > 0) return;
        const angle = aimAngle;
        const weaponSlot = getCurrentSlot();
        sendPacket('z', slot, true);
        setTimeout(() => {
            sendPacket('F', 1, angle);
        }, 20);
        setTimeout(() => {
            sendPacket('F', 0, angle);
            if (weaponSlot !== slot) {
                sendPacket('z', weaponSlot, true);
            }
        }, 70);
        placeCooldown = 4; // ~120ms anti-spam
    }

    function updateAim(e) {
        if (!canvas) return;
        const rect = canvas.getBoundingClientRect();
        const x = e.clientX - rect.left;
        const y = e.clientY - rect.top;
        const cx = canvas.width * 0.5;
        const cy = canvas.height * 0.5;
        aimAngle = Math.atan2(y - cy, x - cx);
    }

    function updateZoom() {
        if (canvas) {
            canvas.style.transform = `scale(${zoomLevel})`;
            canvas.style.transformOrigin = 'center center';
        }
    }

    // Loop principal
    setInterval(() => {
        // Pega canvas
        canvas = document.querySelector('canvas');
        if (canvas && !canvas.dataset.hooked) {
            canvas.dataset.hooked = '1';
            canvas.addEventListener('mousemove', updateAim);
            canvas.addEventListener('wheel', (e) => {
                e.preventDefault();
                zoomLevel += e.deltaY > 0 ? -0.08 : 0.08;
                zoomLevel = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoomLevel));
                updateZoom();
            }, { passive: false });
        }

        // Auto-heal poll
        try {
            const hpBar = document.querySelector('#healthBarInner');
            if (hpBar) {
                const currHp = parseFloat(hpBar.style.width || '100');
                if (currHp < lastHp && currHp < 65) {
                    doAutoHeal();
                }
                lastHp = currHp;
            }
        } catch (e) {}

        if (eatCooldown > 0) eatCooldown--;
        if (placeCooldown > 0) placeCooldown--;

    }, 30);

    // Keybinds
    document.addEventListener('keydown', (e) => {
        if (e.repeat || !canvas) return;
        switch (e.key.toLowerCase()) {
            case 'v': place(6); break; // Spike slot 6
            case 'f': place(7); break; // Trap slot 7
            case 'h': place(8); break; // Turret slot 8 (ou tele se for 9, ajuste)
        }
    });

    console.log('%c🚀 MooMoo Auto-Heal + Hotkeys CARREGADO! (2026)', 'color:#0f0;font-size:16px;');
    console.log('%c• Auto-eat slots 9(pizza)/8(cookie)/7(food) quando HP<65%', 'color:#ff0');
    console.log('%c• V=Spike (slot6), F=Trap(slot7), H=Turret(tele slot8)', 'color:#ff0');
    console.log('%c• Ajuste slots no código se necessário. Zoom wheel OK!', 'color:#ff0');
    console.log('%cRisco ban médio. Teste em sandbox.moomoo.io primeiro! 🔥', 'color:#f0f');

})();