您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Press L to toggle macros: (Spike, Trap, Mill, Turret/Teleport, Heal). Use the "Esc" key to toggle the menu.
// ==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(); })();