MooMoo.io Key Rebinder

F -> Hold Trap/Boost Pad / V -> Hold Spike

目前为 2023-06-06 提交的版本。查看 最新版本

// ==UserScript==
// @name         MooMoo.io Key Rebinder
// @description  F -> Hold Trap/Boost Pad  /  V -> Hold Spike
// @author       Kooky Warrior
// @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.5
// @namespace    https://greasyfork.org/users/999838
// ==/UserScript==

;(async () => {
	unsafeWindow.keyRebinder = true

	let items = [],
		weapons = [],
		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) => {
					if (!e.origin.includes("moomoo.io")) return
					const [packet, data] = msgpack.decode(new Uint8Array(e.data))
					switch (packet) {
						case "1":
							inGame = true
							items = [0, 3, 6, 10]
							weapons = [0]
							break
						case "11":
							inGame = false
							break
						case "17":
							if (data[0]) {
								if (data[1]) weapons = data[0]
								else 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"]
	})

	unsafeWindow.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" && items[4]) {
				ws.iosend("5", items[4])
			} else if (event.code == "KeyV") {
				ws.iosend("5", items[2])
			} else if (event.code === "Digit0" && items[58 - 49 - weapons.length] === 20) {
				ws.iosend("5", 20)
			}
		}
	})

	unsafeWindow.addEventListener("keyup", (event) => {
		if (
			inGame &&
			keys[event.code] &&
			document.getElementById("allianceMenu").style.display != "block" &&
			document.getElementById("chatHolder").style.display != "block"
		) {
			keys[event.code] = false
		}
	})
})()