// ==UserScript== // @name MooMoo.io Key Rebinder // @description F -> Hold Trap/Boost Pad / V -> Hold Spike // @author WEIRD // @match *://*.moomoo.io/* // @icon https://moomoo.io/img/favicon.png?v=1 // @require https://cdnjs.cloudflare.com/ajax/libs/msgpack-lite/0.1.26/msgpack.min.js // @run-at document-start // @grant unsafeWindow // @license MIT // @version 0.1 // @namespace https://greasyfork.org/users/999838 // @downloadURL none // ==/UserScript== (async () => { unsafeWindow.keyRebinder = true let items = [], inGame = false, keys = {}, ws = await new Promise(async resolve => { let { send } = WebSocket.prototype WebSocket.prototype.send = function (...x) { send.apply(this, x) this.send = send; this.iosend = function (...datas) { const [packet, ...data] = datas; this.send(new Uint8Array(Array.from(msgpack.encode([packet, data])))); } this.addEventListener("message", e => { const [packet, data] = msgpack.decode(new Uint8Array(e.data)) switch (packet) { case "1": inGame = true items = [0, 3, 6, 10] break case "11": inGame = false break case "17": if (data[0] && !data[1]) { items = data[0] } break } }) resolve(this) } }) var observer = new MutationObserver(mutations => { mutations.forEach(mutationRecord => { if (document.getElementById("allianceMenu").style.display == "block" || document.getElementById("chatHolder").style.display == "block") { keys = {} } }); }) observer.observe(document.getElementById("allianceMenu"), { attributes: true, attributeFilter: ['style'] }); observer.observe(document.getElementById("chatHolder"), { attributes: true, attributeFilter: ['style'] }); document.body.addEventListener("keydown", event => { if (inGame && !keys[event.code] && document.getElementById("allianceMenu").style.display != "block" && document.getElementById("chatHolder").style.display != "block") { keys[event.code] = true if (event.code == "KeyF") { ws.iosend("5", items[4]) } else if (event.code == "KeyV") { ws.iosend("5", items[2]) } } }) document.body.addEventListener("keyup", event => { if (inGame && keys[event.code] && document.getElementById("allianceMenu").style.display != "block" && document.getElementById("chatHolder").style.display != "block") { keys[event.code] = false } }) })()