您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Display your keyboard keys, mouse, and CPS
// ==UserScript== // @name MooMoo.io Show Keys & Mouse // @description Display your keyboard keys, mouse, and CPS // @author KOOKY WARRIOR // @match *://*.moomoo.io/* // @icon https://moomoo.io/img/favicon.png?v=1 // @run-at document-start // @grant unsafeWindow // @license MIT // @version 0.5.2 // @namespace https://greasyfork.org/users/999838 // ==/UserScript== // Press "\" to open menu // This script was originally made by GG Gamer Br // https://greasyfork.org/en/scripts/424547-moomoo-io-keys ;(() => { unsafeWindow.showKeys = true let storage = JSON.parse(localStorage.getItem("showKeys&Mouse")) if (storage == null) { storage = { keys: ["Q", "F", "V", "1", "2", "3"], cps: true, maxCps: true, mouse: 100, space: 7, container: 270 } localStorage.setItem("showKeys&Mouse", JSON.stringify(storage)) } unsafeWindow.addEventListener("DOMContentLoaded", () => { const DIV = ` <style> #show_key_menu { background-color: rgba(0, 0, 0, 0.25); width: fit-content; height: fit-content; pointer-events: all; color: white; padding: 20px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .show_key_inputs { width: 100%; display: flex; flex-direction: row; align-items: flex-end; margin-bottom: 10px; } .show_key_inputs > * { font-size: 24px; } .show_key_inputs > input[type="number"], .show_key_inputs > input[type="text"] { width: 100px; padding: 6px; border: none; outline: none; box-sizing: border-box; color: #4A4A4A; background-color: #e5e3e3; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; text-transform: uppercase; } .show_key_inputs > input[type="checkbox"] { align-self: center; } .show_key_inputs > label { margin-left: 10px; } .show_key_inputs > div { margin-left: 10px; text-align: center; padding: 6px 10px; box-sizing: border-box; width: fit-content; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; cursor: pointer; } #add_key { background-color: #8ecc51; } #remove_key { background-color: #cc5151; } #add_key:hover { background-color: #6a983f; } #remove_key:hover { background-color: #983f3f; } #show_key_container { position: absolute; left: 15px; bottom: 210px; } .keys { width: 50px; height: 45px; margin: 5px; padding: 2px 10px; border: 2px solid white; color: white; text-align: center; font-size: 25px; top: 50%; line-height: 45px; } .keys.active { color: black; background: white; } #keys { display: flex; flex-wrap: wrap; align-content: start; width: 300px; } #fast { display: flex; margin-bottom: 10px; margin-left: 5px; align-items: center; } #mouseContainer { width: 65px; height: 94px; } #mouse { display: flex; width: 65px; justify-content: space-between; flex-wrap: wrap; transform-origin: 0 0; } #mouse_0 { flex-basis: 24px; height: 50px; border-radius: 100px 10px 10px 10px; border: 2px solid white; } #mouse_1 { flex-basis: 4px; height: 50px; border-radius: 10px; border: 2px solid white; } #mouse_2 { flex-basis: 24px; height: 50px; border-radius: 10px 100px 10px 10px; border: 2px solid white; } #mouse_bottom { margin-top: 1px; flex-basis: 100%; height: 34px; border-radius: 10px 10px 100px 100px; border: 2px solid white; } .active2 { background: white; } #cpsDisplay, #maxCpsDisplay { position: initial; padding-right: 10px; width: fit-content; height: fit-content; text-align: left; margin-bottom: 10px; margin-left: 5px; } </style> <div id="show_key_menu" style="display: none"> <div class="show_key_inputs"> <input id="mouse_size" type="number" value="${storage.mouse}" min="0" onchange="changeShowKeyMouseProperty('mouse', parseFloat(this.value))"> <label for="mouse_size">Mouse Size</label> </div> <div class="show_key_inputs"> <input id="spacebar_size" type="number" value="${ storage.space }" oninput="this.value = Math.round(this.value)" onchange="changeShowKeyMouseProperty('space', parseInt(this.value))" max="20" min="0"> <label for="spacebar_size">Spacebar Size</label> </div> <div class="show_key_inputs"> <input id="container_size" type="number" value="${ storage.container }" min="0" onchange="changeShowKeyMouseProperty('container', parseFloat(this.value))"> <label for="container_size">Container Size</label> </div> <div class="show_key_inputs"> <input id="show_cps" type="checkbox" ${storage.cps ? "checked" : ""} onchange="changeShowKeyMouseProperty('cps', this.checked)"> <label for="show_cps">CPS</label> </div> <div class="show_key_inputs"> <input id="show_maxcps" type="checkbox" ${storage.maxCps ? "checked" : ""} onchange="changeShowKeyMouseProperty('maxCps', this.checked)"> <label for="show_maxcps">MAX CPS</label> </div> <div class="show_key_inputs"> <input id="enter_key" type="text" maxlength="1" placeholder="Enter Key" style="width: 200px; text-align: center;"> <div id="add_key" onclick="addKey_ShowKeyMouse()"><span>Add</span></div> <div id="remove_key" onclick="removeKey_ShowKeyMouse()"><span>Remove</span></div> </div> </div> <div id="show_key_container"> <div id="fast"> <div id="mouseContainer" style="display: ${storage.mouse > 0 ? "block" : "none"}; width: ${65 * (storage.mouse / 100)}px; height: ${ 94 * (storage.mouse / 100) }px"> <div id="mouse" style="transform: scale(${storage.mouse}%)"> <div id="mouse_0"></div> <div id="mouse_1"></div> <div id="mouse_2"></div> <div id="mouse_bottom"></div> </div> </div> <div class="keys" id="key_Space" style="margin-left: ${storage.mouse > 0 ? 10 : 0}px; width: fit-content; display: ${ storage.space > 0 ? "block" : "none" }">_______</div> </div> <div id="cpsDisplay" class="resourceDisplay" style="display: ${storage.cps ? "block" : "none"}">CPS: 0</div> <div id="maxCpsDisplay" class="resourceDisplay" style="display: ${storage.maxCps ? "block" : "none"}">MAX CPS: 0</div> <div id="keys" style="display: ${storage.container <= 0 || storage.keys.length == 0 ? "none" : "flex"}; width: ${storage.container}px"></div> </div> ` const container = document.createElement("div") container.innerHTML = DIV document.getElementById("gameUI").appendChild(container) storage.keys.forEach((key) => { const element = document.createElement("div") element.id = `key_${key}` element.className = "keys" element.textContent = key document.getElementById("keys").appendChild(element) }) document.getElementById("keys").style.display = storage.container <= 0 || storage.keys.length == 0 ? "none" : "flex" unsafeWindow.changeShowKeyMouseProperty = (id, value) => { storage[id] = value localStorage.setItem("showKeys&Mouse", JSON.stringify(storage)) document.getElementById("mouseContainer").style.width = `${65 * (storage.mouse / 100)}px` document.getElementById("mouseContainer").style.height = `${94 * (storage.mouse / 100)}px` document.getElementById("mouseContainer").style.display = storage.mouse > 0 ? "block" : "none" document.getElementById("key_Space").style.marginLeft = `${storage.mouse > 0 ? 10 : 0}px` document.getElementById("mouse").style.transform = `scale(${storage.mouse}%)` document.getElementById("key_Space").textContent = "_".repeat(storage.space) document.getElementById("key_Space").style.display = storage.space > 0 ? "block" : "none" document.getElementById("cpsDisplay").style.display = storage.cps ? "block" : "none" document.getElementById("maxCpsDisplay").style.display = storage.maxCps ? "block" : "none" document.getElementById("keys").style.display = storage.container <= 0 || storage.keys.length == 0 ? "none" : "flex" document.getElementById("keys").style.width = `${storage.container}px` } unsafeWindow.addKey_ShowKeyMouse = () => { const key = document.getElementById("enter_key").value.toUpperCase() let element = document.getElementById(`key_${key}`) if (element == null) { element = document.createElement("div") element.id = `key_${key}` element.className = "keys" element.textContent = key document.getElementById("keys").appendChild(element) storage.keys.push(key) localStorage.setItem("showKeys&Mouse", JSON.stringify(storage)) } } unsafeWindow.removeKey_ShowKeyMouse = async () => { const key = document.getElementById("enter_key").value.toUpperCase() const element = document.getElementById(`key_${key}`) if (element != null) { element.remove() const index = storage.keys.indexOf(key) if (index > -1) { await storage.keys.splice(index, 1) localStorage.setItem("showKeys&Mouse", JSON.stringify(storage)) } document.getElementById("keys").style.display = storage.container <= 0 || storage.keys.length == 0 ? "none" : "flex" } } var currentCps = 0 var maxCps = 0 var spaceDown = false function addCPS() { currentCps++ document.getElementById("cpsDisplay").innerText = `CPS: ${currentCps}` if (currentCps > maxCps) { maxCps = currentCps document.getElementById("maxCpsDisplay").innerText = `MAX CPS: ${maxCps}` } setTimeout(() => { currentCps-- document.getElementById("cpsDisplay").innerText = `CPS: ${currentCps}` }, 1000) } function keysActive() { let returnValue returnValue = document.getElementById("allianceMenu").style.display != "block" && document.getElementById("chatHolder").style.display != "block" return returnValue } unsafeWindow.addEventListener("keydown", (event) => { if (keysActive()) { if (event.code == "Backslash") { document.getElementById("show_key_menu").style.display = document.getElementById("show_key_menu").style.display == "block" ? "none" : "block" } else if (event.code == "Space") { if (!spaceDown) { spaceDown = true const keyDiv = document.getElementById(`key_Space`) if (keyDiv && !keyDiv.classList.contains("active")) { keyDiv.classList.add("active") } addCPS() } } else { const keyDiv = document.getElementById(`key_${event.key.toUpperCase()}`) if (keyDiv && !keyDiv.classList.contains("active")) { keyDiv.classList.add("active") } } } }) unsafeWindow.addEventListener("keyup", (event) => { if (event.code == "Space") { spaceDown = false const keyDiv = document.getElementById(`key_Space`) if (keyDiv && keyDiv.classList.contains("active")) { keyDiv.classList.remove("active") } } else { const keyDiv = document.getElementById(`key_${event.key.toUpperCase()}`) if (keyDiv && keyDiv.classList.contains("active")) { keyDiv.classList.remove("active") } } }) document.getElementById("touch-controls-fullscreen").addEventListener("mousedown", (event) => { if ([0, 1, 2].includes(event.button)) { addCPS() } let mouseDiv = document.getElementById(`mouse_${event.button}`) if (mouseDiv && !mouseDiv.classList.contains("active2")) { mouseDiv.classList.add("active2") } }) document.getElementById("touch-controls-fullscreen").addEventListener("mouseup", (event) => { let mouseDiv = document.getElementById(`mouse_${event.button}`) if (mouseDiv && mouseDiv.classList.contains("active2")) { mouseDiv.classList.remove("active2") } }) }) })()