// ==UserScript== // @name Minecraft Helper // @namespace http://tampermonkey.net/ // @version 0.3.2 // @description 为 Minecraft 玩家定制的实用脚本 // @author PRO // @license gpl-3.0 // @match https://www.minecraft.net/* // @match https://www.curseforge.com/* // @match https://modrinth.com/* // @icon https://www.minecraft.net/etc.clientlibs/minecraft/clientlibs/main/resources/img/minecraft-creeper-face.jpg // @grant none // @downloadURL none // ==/UserScript== (function () { 'use strict'; let config = { "general": { "timeout": 500 // 部分功能的延迟 }, "minecraft": { "auto-stay": true // 自动点击“留在 Minecraft.net” }, "curseforge": { "auto-mod": true, // 首页自动转到 MC 模组界面 "highlight-files": true, // 突出显示 "Files" 项目 "highlight-border": "rgb(241, 100, 54) 0.2em solid", "default-download": true // 默认直接下载 }, "modrinth": { "auto-mod": true, // 首页自动转到 MC 模组界面 "shortcut": true // 快捷键: iles, <-, -> } }; function try_click(selector) { let ele = document.querySelector(selector); if (ele) ele.click(); } switch (window.location.host) { case 'www.minecraft.net': { if (config.minecraft["auto-stay"]) try_click("#popup-btn"); break; } case 'www.curseforge.com': { if (config.curseforge["auto-mod"] && window.location.pathname == '/') { window.location.pathname = "/minecraft/mc-mods"; } if (config.curseforge["highlight-files"] && window.location.pathname != "/") { let tabs = document.getElementsByClassName("tabs"); if (tabs.length) { tabs = tabs[0]; for (let tab of tabs.children) { if (tab.textContent == "Files") { tab.style.border = config.curseforge["highlight-border"]; break; } } } } if (config.curseforge["default-download"]) { function cf_replace(menu) { menu.children[0].remove(); let down = menu.querySelector("#contextMenu").children[1]; let new_btn = document.createElement("button"); new_btn.innerHTML = 'Download'; new_btn.setAttribute("class", "btn-cta"); new_btn.onclick = (e) => { window.location.href = down.children[0].href; }; menu.insertBefore(new_btn, menu.children[0]); } let menu = document.querySelector("#menuButton"); cf_replace(menu); let content = document.getElementsByClassName("tab-content")[0]; let cfg = { attributes: false, childList: true, subtree: true }; let callback = (mutations, observer) => { for (let mutation of mutations) { if (mutation.addedNodes.length && mutation.addedNodes[0].nodeName == "SECTION") { let menu = mutation.addedNodes[0].querySelector("#menuButton"); if (menu) cf_replace(menu); } } }; let observer = new MutationObserver(callback); observer.observe(content, cfg); } break; } case "modrinth.com": { if (window.location.pathname == "/" && config.modrinth["auto-mod"]) { try_click(".button-group > a"); } if (config.modrinth.shortcut) { document.addEventListener("keydown", (e) => { if (document.activeElement.nodeName != "INPUT") { switch (e.key) { case "ArrowLeft": try_click(".left-arrow"); break; case "ArrowRight": try_click(".right-arrow"); break; case "f": try_click(".goto-link"); break; case "s": try_click(".navigation > a.nav-link"); window.setTimeout(() => { let search = document.getElementById("search"); if (search) search.focus(); }, config.general.timeout); e.preventDefault(); break; default: break; } } else if (document.activeElement.value == "") { switch (e.key) { case "Escape": document.activeElement.blur(); break; case "ArrowLeft": try_click(".left-arrow"); break; case "ArrowRight": try_click(".right-arrow"); break; default: break; } } }) } break; } } })();