Effortless

Press L to toggle macros: (Spike, Trap, Mill, Turret/Teleport, Heal). Use the "Esc" key to toggle the menu.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name        Effortless
// @author      Seryo
// @description
// @
// @ Controls:
// @
// @ •	V = Spike / Great spike / Spinning spike / Poison spike
// @ •	F = Trap / Boost
// @ •	N = Windmill / Faster windmill / Power mill
// @ •	H = Turret / Teleport / Blocker / Platform / Healing pad
// @ •	0 = Spawn pad
// @ •	Keycode 18 = Wood wall / Stone wall / Castle wall
// @ •	Q = Apple / Cookie / Cheese
// @
// @ Macros toggle with Keycode 186 (change it in line 151)
// @ Change macro keycodes on line 314
// @ Giant map toggles with Keycode 36 (change it in line 395)
// @ Menu toggles with ESC or Keycode 27 (change it in line 158)
// @
// @ Menu Controls:
// @
// @ Toggle biome map with a switch
// @ Toggle CPS display with a switch
// @ Toggle macros manually with a switch
// @ Toggle auto-respawn with a switch (randomly changes your skin on respawn)
// @
// @version     0.2
// @match       *://*.moomoo.io/*
// @namespace   https://greasyfork.org/users/1190411
// @icon        https://cdn.glitch.com/82ae8945-dcc6-4276-98a9-665381b4cd2b/cursor12.png
// @license     MIT
// @grant       none
// @require     https://cdn.jsdelivr.net/npm/[email protected]/dist/msgpack.min.js
// @require     http://code.jquery.com/jquery-3.3.1.min.js
// @require     https://code.jquery.com/ui/1.12.0/jquery-ui.min.js
// @description Press L to toggle macros: (Spike, Trap, Mill, Turret/Teleport, Heal). Use the "Esc" key to toggle the menu.
// ==/UserScript==

(function () {
    'use strict';

var pi = Math.PI,
    date = new Date(),
    old = Date.now(),
    cos = Math.cos,
    sin = Math.sin,
    abs = Math.abs,
    pow = Math.pow,
    min = Math.min,
    max = Math.max,
    atan2 = Math.atan2,
    sqrt = Math.sqrt,
    random = Math.random,
    floor = Math.floor;

function rdm(a,b) {
    return Math.floor(Math.random() *(b - a + 1)) + a;
}

function isChatOpen() {
    return document.activeElement.id.toLowerCase() === 'chatbox';
}

function isAllianceInputActive() {
    return document.activeElement.id.toLowerCase() === 'allianceinput';
}

function shhk() {
    return !isChatOpen() && !isAllianceInputActive();
}

    document.body.insertAdjacentHTML('afterbegin', `

    <div id="infomenu" style="display:none; background:rgba(0,0,0,0.8); font-family:'Hammersmith One',sans-serif; position:absolute; width:260px; height:220px; border:2px solid black; border-radius:10px; top:20px; left:20px; z-index:1; box-shadow:5px 5px 10px rgba(0,0,0,0.4);">
        <div class="nameblock" style="font-size:28px; font-weight:bold; color:#fff; padding:10px 0;">Effortless</div>
        <hr>
        <ul style="list-style-type:none; padding:0;">
            <li><label><div class="text" style="font-size:18px; color:#fff;">Biome map</div><span class="checkmark"></span><input type="checkbox" id="NewMap"></label></li>
            <li><label><div class="text" style="font-size:18px; color:#fff;">Show CPS</div><span class="checkmark"></span><input type="checkbox" id="CPSTOGGLER"></label></li>
<li><label>
                 <div class="text" style="font-size:18px; color:#fff; margin-right: 8px;">Macros</div>
<span class="checkmark"></span>
<input type="checkbox" id="AHK">
            </label></li>            <li style="margin-bottom:-55px;"><label><div class="text" style="font-size:18px; color:#fff;">AutoRespawn</div><span class="checkmark"></span><input type="checkbox" id="autospawn"></label></li>
            <li><label><div class="text" style="font-size:18px; color:#fff;" contenteditable="true" id="Soldier_Q"></div><span class=""></span></label></li>
            <li><label><div class="text" style="font-size:18px; color:#fff;" contenteditable="true" id="Clicks"></div><span class=""></span></label></li>
            <li class="transparent-text" style="position:absolute; top:-9999px; left:-9999px; margin-bottom:-20px;">
                <div class="text" style="font-size:18px; color:#fff; margin-top:0px;">
                    <div class="Input_Text_style" style="width:60px; border:none; background:transparent;" contenteditable="true" id="MakeClan"></div>
                </div>
            </li>
        </ul>
        <hr>
        <div class="nameblock" style="font-size:28px; font-weight:bold; color:#fff; padding:10px 0; margin-top:0px;">Hotkeys</div>
        <hr>
        <div class="text" style="font-size:18px; color:#fff; white-space:pre-line;">
            <div style="margin-top:-17px; margin-bottom:-10px; font-size:18px;">V = Spike</div>
            <div style="margin-bottom:-18px; font-size:18px;">F = Trap</div>
            <div style="margin-bottom:-18px; font-size:18px;">N = Mill</div>
            <div style="margin-bottom:-18px; font-size:18px;">H = Turret / Teleport</div>
            <div style="margin-bottom:-18px; font-size:18px;">0 = Spawnpad</div>
            <div style="margin-bottom:-18px; font-size:18px;">Keycode 18 = Wall</div>
            <div style="margin-bottom:-18px; font-size:18px;">Q = Healing</div>
            <div style="margin-bottom:-18px; font-size:18px;">3 = Healing</div>
            <div style="margin-bottom:-18px; font-size:18px;">Keycode 186 = Toggle Macros</div>
        </div>
    </div>
    <style>
        button:active, button:focus { outline:none !important; }
        button::-moz-focus-inner { border:0 !important; }
        .nameblock { font-size:20px; color:#fff; text-align:center; }
        li { font-size:18px; margin-bottom:10px; }
        .text { display:block; font-size:18px; color:#fff; text-align:left; }
        label { display:flex; justify-content:space-between; align-items:center; width:100%; }
        .checkmark { margin-left:10px; }
        ::-webkit-scrollbar { width:5px; height:3px; }
        ::-webkit-scrollbar-button { background-color:#000000; }
        ::-webkit-scrollbar-track { background-color:#808080; }
        ::-webkit-scrollbar-track-piece { background-color:rgba(0,0,0,0.50); }
        ::-webkit-scrollbar-thumb { height:50px; background-color:#666; border-radius:3px; }
        ::-webkit-scrollbar-corner { background-color:#808080; }
        ::-webkit-resizer { background-color:#808080; }
        #infomenu { overflow-y:scroll; overflow-x:hidden; padding:20px; }
        input { outline:0 !important; }
    </style>
    <script>
        var isDragging=false; var initialX; var initialY; var menuElement=document.getElementById("infomenu");
        function dragStart(e) { isDragging=true; initialX=e.clientX-menuElement.getBoundingClientRect().left; initialY=e.clientY-menuElement.getBoundingClientRect().top; }
        function dragEnd() { isDragging=false; }
        function drag(e) { if(!isDragging) return; menuElement.style.left=(e.clientX-initialX)+'px'; menuElement.style.top=(e.clientY-initialY)+'px'; }
        menuElement.addEventListener('mousedown', dragStart);
        document.addEventListener('mouseup', dragEnd);
        document.addEventListener('mousemove', drag);
    </script>
`);

    document.body.insertAdjacentHTML('afterbegin', `
    <div id="ShowMenu">
        <div id="addtext3"> Macros: On</div>
        <div id="addtext4">AutoSpawn: On</div>
        <style>
            #ShowMenu { position:absolute !important; display:block; top:5px; left:-150px; width:auto; height:auto; text-align:center; }
            #addtext, #addtext1, #addtext2, #addtext0, #addtext3, #addtext4 { display:none; color:black; font-weight:bold; font-family:'Hammersmith One',sans-serif; }
            @-webkit-keyframes colorR { 0% { background-position:0% 50% } 50% { background-position:100% 50% } 100% { background-position:0% 50% } }
            @keyframes colorR { 0% { background-position:0% 50% } 50% { background-position:100% 50% } 100% { background-position:0% 50% } }
        </style>
        <script>
            let tm, t="Moo Moo";
            function change(icon, text) { document.querySelector('head title').innerHTML=text; document.querySelector('link[rel="shortcut icon"]').setAttribute('href',icon); }
            window.onfocus=()=> change("https://sandbox.moomoo.io/img/favicon.png?v=1", t);
        </script>
    </div>
`);

document.addEventListener('keydown', function(e) {
        if (e.keyCode === 186 && shhk()) {
            var macrosCheckbox = document.getElementById("AHK");
            macrosCheckbox.click();
        }
    });

document.addEventListener('keydown', function (event) {
        if (event.keyCode === 27 && shhk() && storeMenu.style.display !== 'block') {
            var infomenu = document.getElementById("infomenu");
            infomenu.style.display = (infomenu.style.display === 'none') ? 'block' : 'none';
        }
    });

let mouseX, mouseY, width, height;
let pr, sec, st, bt, ft, mlt, wt, spt, tr;
let AHK = false;
let autospawn = false;
let websocket;

const url = new URL(window.location.href);
window.sessionStorage.force = url.searchParams.get("fc");
const myPlayer = {
    id: null,
    x: null,
    y: null,
    dir: null,
    object: null,
    weapon: null,
    isLeader: null,
    isSkull: null
};
const MsgPack = msgpack;
document.msgpack = msgpack;

WebSocket.prototype.OldSend = WebSocket.prototype.send;
WebSocket.prototype.send = function (e) {
    if (!websocket) {
        Greasy(this);
        websocket = this;
        document.websocket = this;
    }
    this.OldSend(e);
};
function Greasy(msg){
    msg.addEventListener('message', function(cd){
        Handler(cd);
    });
}
function Handler(e) {
    let tmp = MsgPack.decode(new Uint8Array(e.data));
    let data;
    if(tmp.length >= 1) {
        data = [tmp[0], ...tmp[1]];
        if (data[1] instanceof Array){
            data = data;
        }
    } else {
        data = tmp;
    }
    let item = data[0];
    if(!data) {
        return;
    }
    if (item == "a") {
        for(let e = 0; e < data[1].length / 13; e++) {
            let Arr = data[1].slice(13*e, 13*e+13);
            if(Arr[0] == myPlayer.id) {
                myPlayer.x = Arr[1];
                myPlayer.y = Arr[2];
                myPlayer.dir = Arr[3];
                myPlayer.object = Arr[4];
                myPlayer.weapon = Arr[5];
                myPlayer.isLeader = Arr[8];
                myPlayer.isSkull = Arr[11];
            }
        }
    }
    if (item == "C" && myPlayer.id == null){
        myPlayer.id = data[1];
    }
    if (item == "io-init") {
        let cvs = document.getElementById("gameCanvas");
        width = cvs.clientWidth;
        height = cvs.clientHeight;
        $(window).resize(function() {
            width = cvs.clientWidth;
            height = cvs.clientHeight;
        });
        cvs.addEventListener("mousemove", (e) => {
            mouseX = e.clientX;
            mouseY = e.clientY;
        });
    }
    UpdateItems();
    if(autospawn == true){
        item == "P" &&
            setTimeout(() => {
            emit('M', {name:localStorage.getItem("moo_name"), moofoll: "1", skin: rdm(8,1)});
        },3000);
    }
}

function Sender(e) {
    websocket.send(new Uint8Array(Array.from(MsgPack.encode(e))));
}
function emit(e,a,b,c,m,r) {
    Sender([e, [a,b,c,m,r]]);
}

function use(e, a = Math.atan2(mouseY - height / 2, mouseX - width / 2)) {
    emit("G", e, null);
    emit("d", 1, a);
    emit("d", 0, a);
    emit("G", myPlayer.weapon, true);
}

function useQ(e) {
    emit("G", e, null);
    emit("d", 1, null);
    emit("d", 0, null);
    emit("G", myPlayer.weapon, true);
}

const rptr = function (key, action, interval) {
    let _isKeyDown = false;
    let _lastExecution = 0;
    let _animationFrameId = null;

    const intervalCallback = (timestamp) => {
        if (!_isKeyDown) return;

        if (timestamp - _lastExecution >= interval) {
            action();
            _lastExecution = timestamp;
        }

        _animationFrameId = requestAnimationFrame(intervalCallback);
    };

    return {
        start(keycode) {
            if (keycode === key && shhk()) {
                _isKeyDown = true;

                // Ejecutar la acción inmediatamente sin demora
                if (key !== 81 && key !== 51) action();

                if (_animationFrameId === null) {
                    _animationFrameId = requestAnimationFrame(intervalCallback);
                }
            }
        },
        stop(keycode) {
            if (keycode === key && shhk()) {
                _isKeyDown = false;
                if (_animationFrameId !== null) {
                    cancelAnimationFrame(_animationFrameId);
                    _animationFrameId = null;
                }
            }
        },
    };
};

const createHotkey = (keyCode, action) => rptr(keyCode, () => {
        action();
    }, 37);

const KeyHeal_3 = createHotkey(51, () => useQ(ft, null));
const KeyHeal_Q = createHotkey(81, () => useQ(ft, null));
const Put_Boost = createHotkey(70, () => use(bt));
const Put_Spike = createHotkey(86, () => use(st));
const Put_Mills = createHotkey(78, () => use(mlt));
const Put_Turret = createHotkey(72, () => use(tr));
const Put_Wall = createHotkey(18, () => use(wt));
const Put_Spawn = createHotkey(48, () => use(spt));
const handleKeyEvent = (e, action) => {
    if (AHK) {
        KeyHeal_3[action](e.keyCode);
        KeyHeal_Q[action](e.keyCode);
        Put_Boost[action](e.keyCode);
        Put_Spike[action](e.keyCode);
        Put_Mills[action](e.keyCode);
        Put_Turret[action](e.keyCode);
        Put_Wall[action](e.keyCode);
        Put_Spawn[action](e.keyCode);
    }
};

document.addEventListener('keydown', (e) => {
    handleKeyEvent(e, 'start');
});

document.addEventListener('keyup', (e) => {
    handleKeyEvent(e, 'stop');
});

function UpdateItems() {
    for (let i=0;i<9;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))){ pr = i; }}

    for (let i=9;i<16;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))){ sec = i; }}

    for (let i=16;i<19;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))){ ft = i - 16; }}

    for (let i=19;i<22;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))){ wt = i - 16; }}

    for (let i=22;i<26;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))){ st = i - 16; }}

    for (let i=26;i<29;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))){ mlt = i - 16; }}

    for (let i=31;i<33;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))){ bt = i - 16; }}

   for (let i=33;i<39;i++){ if (Element_Visible(document.getElementById("actionBarItem" + i.toString())) && i != 36){ tr = i - 16; }}

        spt = 20;
}

function Element_Visible(e) {
    return e.offsetParent !== null;
}
function findVisibleItem(start, end) {
    for (let i = start; i < end; i++) {
        if (Element_Visible(document.getElementById("actionBarItem" + i.toString()))) {
            return i;
        }
    }
    return 0;
}
var Soldier_Q = false;
var Clicks = false;
var bigMap = false;
var leaderBlock = document.getElementById("leaderboard");
var scoreDisplay = document.getElementById("scoreDisplay");
var mapDisplay = document.getElementById("mapDisplay");
var chatBox = document.getElementById("chatbox");
var allianceInput = document.getElementById("allianceInput");

// Event listener para clicks en el canvas
const cvs = document.getElementById("gameCanvas");
cvs.addEventListener("mousedown", clicks, false);

function clicks(e) {
    if (Clicks && (e.button === 0 || e.button === 2)) {
        const addTextId = e.button === 0 ? 'addtext1' : 'addtext2';
        document.getElementById(addTextId).style.display = "block";
    }
}

document.addEventListener('keydown', (e) => {
    if (e.keyCode === 36 && shhk()) {
        if (e.keyCode === 36) {
            const mapDisplay = $("#mapDisplay");

            if (!bigMap) {
                bigMap = true;
                mapDisplay.css({
                    "background-size": "425px",
                    "position": "absolute",
                    "margin-top": "150px",
                    "right": "20px",
                    "background-color": "rgba(0, 0, 0, 0.1)",
                    "height": "425px",
                    "width": "425px",
                    "border-radius": "5px",
                });

                if (scoreDisplay) {
                    scoreDisplay.style.display = "none";
                }
            } else {
                bigMap = false;
                mapDisplay.css({
                    "background-size": "130px",
                    "position": "absolute",
                    "bottom": "20px",
                    "left": "20px",
                    "margin-top": "638px",
                    "background-color": "rgba(0, 0, 0, 0.1)",
                    "height": "130px",
                    "width": "130px",
                    "box-shadow": "none",
                    "border": "none"
                });

                if (scoreDisplay) {
                    scoreDisplay.style.display = "block";
                }
            }
        }
    }
});

var infomenu = document.getElementById("infomenu");
    var autoSpawnCheckbox = document.querySelector("#autospawn");
    var addText4Element = document.getElementById('addtext4');
    var cpsss = document.querySelector("#CPSTOGGLER");
    var AHKK = document.querySelector("#AHK");
    var cl = document.querySelector("#Clicks");
    var NewMapp = document.querySelector("#NewMap");
    var cpsM = document.getElementById("cpss");

autoSpawnCheckbox.addEventListener('change', function () {
        var isChecked = this.checked;
        addText4Element.style.display = isChecked ? "block" : "none";
        autospawn = isChecked;
    });

    cpsss.addEventListener('change', function () {
        cpsM.style.display = this.checked ? "block" : "none";
    });

    AHKK.addEventListener('change', function () {
        var addtext3 = document.getElementById('addtext3');
        AHK = this.checked;
        addtext3.style.display = AHK ? "block" : "none";
    });

    cl.addEventListener('change', function () {
        var addtext = document.getElementById('addtext');
        Clicks = this.checked;
        addtext.style.display = Clicks ? "block" : "none";
    });

    NewMapp.addEventListener('change', function () {
        mapDisplay.style.background = this.checked ? "url('https://wormax.org/chrome3kafa/moomooio-background.png')" : "rgba(0, 0, 0, 0.1)";
    });

var cps = 0;
var click = 1;

function handleMouseDown(e) {
    if ((e.which == 1 || e.button == 1) && click == 1) {
        cps++;
        setTimeout(() => {
            cps--;
        }, 950);
    }
}

$("#gameCanvas").mousedown(handleMouseDown);
document.addEventListener("mousedown", handleMouseDown, false);

cpsM = document.createElement("div");
const cpsMStyle = cpsM.style;

Object.assign(cpsMStyle, {
    display: "none",
    color: '#fff',
    fontFamily: "'Hammersmith One', sans-serif",
    fontSize: '30px',
    left: '20px',
    position: 'fixed',
});

cpsM.id = "cpss";
document.body.appendChild(cpsM);

function updateCPS() {
    cpsM.textContent = `Cps: ${cps}`;
    requestAnimationFrame(updateCPS);

    const cpstoggler = document.querySelector("#CPSTOGGLER");
    cpsMStyle.textShadow = cpstoggler.checked ? '2px 2px 4px rgba(0, 0, 0, 0.5)' : 'none';

    const infomenu = document.getElementById("infomenu");
    cpsMStyle.top = infomenu.style.display === 'block' ? '295px' : '20px';
}

updateCPS();

})();