Simple auto-healing script for MooMoo.io.
< Feedback on MooMoo.io Auto Heal
Hello, this is a message to the owner, I made a few changes to your script to make the reading clear. Changed the menu to make it look 10x better. No need to give me credit as I only made this account to make this message. In case anyone is wondering, my name is z-r.. Press 'esc' for menu.
// ==UserScript== // @name MooMoo.io Auto Heal // @namespace https://google.com // @version 1.0 // @description Simple auto-healing script for MooMoo.io. // @match *://moomoo.io/* // @match *://*.moomoo.io/* // @author z-r // @require https://greasyfork.org/scripts/423602-msgpack/code/msgpack.js // @grant none // @license MIT // ==/UserScript== (function () { /* Variables: */ let HealSpeed = 120; let HealEnabled = true; let items = []; let weapons = []; let inGame = false; let tmpHealth = 100; let z3r0 = 0; let zrz = 0; let msgpack = window.msgpack; let ws; /* Websocket setup: */ ws = new Promise(function (resolve) { let { send } = WebSocket.prototype; WebSocket.prototype.send = function (...x) { send.apply(this, x); this.send = send; this.io = function (...datas) { const [packet, ...data] = datas; this.send(new Uint8Array(Array.from(msgpack.encode([packet, data])))); }; this.addEventListener("message", function (e) { const [packet, data] = msgpack.decode(new Uint8Array(e.data)); let sid = data[0]; let health = data[1]; let inventory = { food: items[0], walls: items[1], spikes: items[2], mill: items[3], mine: items[4], trap: items[5], booster: items[6], turret: items[7], watchtower: items[8], buff: items[9], spawn: items[10], sapling: items[11], blocker: items[12], teleporter: items[13] }; let addEventListener = { setupGame: "C", updateHealth: "O", killPlayer: "P", updateItems: "V" }; switch (packet) { case addEventListener.setupGame: inGame = true; items = [0, 3, 6, 10]; weapons = [0]; break; case addEventListener.updateHealth: if (sid) { const AutoHealSpeed = parseInt(document.getElementById('speedInput').value); if (inGame && HealEnabled) { if (health < 100 && health > 0) { setTimeout(function () { place(inventory.food); place(inventory.food); place(inventory.food); place(inventory.food); }, AutoHealSpeed); } } if (tmpHealth - health < 0) { if (z3r0) { let timeHit = Date.now() - z3r0; z3r0 = 0; zrz = timeHit <= 120 ? zrz + 1 : Math.max(0, zrz - 2); } } else { z3r0 = Date.now(); } tmpHealth = health; } break; case addEventListener.killPlayer: inGame = false; break; case addEventListener.updateItems: if (sid) { if (health) { weapons = sid; } else { items = sid; } } break; } }); resolve(this); }; }); /* Functions: */ const sendPacket = function (...datas) { const [type, ...data] = datas; var binary = msgpack.encode([type, data]); ws.then(function (wsInstance) { wsInstance.send(new Uint8Array(Array.from(binary))); }); }; /* Place: */ const place = function (id, ang) { if (inGame) { sendPacket("G", id, false); hit(ang); selectWeapon(); } }; /* Select weapon: */ const selectWeapon = function () { if (inGame) { sendPacket("G", weapons[0], true); } }; /* Hit: */ const hit = function (id, ang) { if (inGame) { sendPacket("d", 1, ang); sendPacket("d", 0, ang); } }; /* Chat: */ const chat = function (e) { if (inGame) { sendPacket("6", e); } }; /* Creating modMenu div: */ let modMenus = document.createElement("div"); modMenus.id = "modMenus"; document.body.append(modMenus); /* Set CSS styles for modMenu: */ modMenus.style.display = "none"; // Initially hide the menu modMenus.style.flexDirection = "column"; modMenus.style.alignItems = "center"; modMenus.style.padding = "20px"; modMenus.style.backgroundColor = "#282c34"; // Dark background color modMenus.style.borderRadius = "10px"; modMenus.style.position = "fixed"; modMenus.style.left = "50%"; modMenus.style.top = "50%"; modMenus.style.transform = "translate(-50%, -50%)"; modMenus.style.width = "320px"; modMenus.style.maxHeight = "80vh"; modMenus.style.overflowY = "auto"; modMenus.style.overflowX = "hidden"; // Hide horizontal scrollbar modMenus.style.boxShadow = "0 8px 16px rgba(0, 0, 0, 0.5)"; modMenus.style.color = "#fff"; // White text color modMenus.style.fontFamily = "'Roboto', sans-serif"; // Modern font /* Update innerhtml content: */ function updateInnerHTML() { modMenus.innerHTML = ` <h2 style="font-size: 32px; margin-bottom: 20px;">Auto Heal Settings</h2> <hr style="width: 100%; border: none; border-top: 1px solid rgba(255, 255, 255, 0.3); margin-bottom: 20px;"> <label for="speedInput" style="font-size: 18px; margin-bottom: 10px;">Speed:</label> <input type="number" id="speedInput" oninput="this.value = this.value.slice(0, 4)" value=${HealSpeed} style="width: 100%; padding: 10px; margin-bottom: 20px; border: none; border-radius: 8px; background-color: rgba(255, 255, 255, 0.1); color: #fff;"> <!-- White input text color --> <input type="checkbox" checked id="AutoHeal" style="margin-right: 10px;"> <label for="AutoHeal" style="font-size: 18px; color: rgba(255, 255, 255, 0.8);">Enable Auto Heal</label> <br>`; } /* Update innerHTML: */ updateInnerHTML(); /* Toggle modMenus visibility when 'Esc' key is pressed. */ document.addEventListener('keydown', function(event) { if (event.key === 'Escape') { modMenus.style.display = modMenus.style.display === 'none' ? 'flex' : 'none'; } }); /* Script menu continued: */ function ElementGet(id) { return document.getElementById(id); } /* More script-menu: */ ElementGet("AutoHeal").onclick = function () { HealEnabled = !HealEnabled; chat(`Auto-heal has been ${HealEnabled ? 'enabled.' : 'disabled.'}`); }; ElementGet("speedInput").oninput = function () { chat(`Auto-heal speed: ${ElementGet("speedInput").value}`); }; })();
ok thanks, maybe I'll take that into account for the next update