您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Brings map information outside
// ==UserScript== // @name MH - Outside Map (Halloween) // @version 1.0.10 // @description Brings map information outside // @author Maidenless // @match https://www.mousehuntgame.com/* // @match https://apps.facebook.com/mousehunt/* // @resource https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css // @require https://code.jquery.com/ui/1.12.1/jquery-ui.js // @require https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js // @icon https://www.google.com/s2/favicons?domain=mousehuntgame.com // @namespace https://gf.qytechs.cn/users/748165 // ==/UserScript== var debugging = false; //Repetitive coding bandage $(document).ajaxComplete(async (event, xhr, options) => { const maps = user.quests.QuestRelicHunter.maps; var index = maps.findIndex(map => map.name.includes("Halloween")); if (index < 0) { return; } var halloween_map_id = maps[index].map_id; if ((options.url == "https://www.mousehuntgame.com/managers/ajax/users/changetrap.php") && user.environment_name == "Gloomy Greenwood") { console.log("Trap change Trigger") getMapInfo(halloween_map_id) .then(res => { generate(res); }) } }) $(document).ready(function () { if (user.environment_name != "Gloomy Greenwood") { return; } else { const maps = user.quests.QuestRelicHunter.maps; var index = maps.findIndex(map => map.name.includes("Halloween")); if (index < 0) { return; } var halloween_map_id = maps[index].map_id; console.log("Page Load Trigger") getMapInfo(halloween_map_id) .then(res => { generate(res); }) //stolen from brad const addStyles = (styles) => { const existingStyles = document.getElementById('mi-custom-styles'); if (existingStyles) { existingStyles.innerHTML += styles; } else { const style = document.createElement('style'); style.id = 'mi-custom-styles'; style.innerHTML = styles; document.head.appendChild(style); } }; //Add a mutation observer const observerTarget = $(".mousehuntHud-userStat.treasureMap")[0].children[2]; if (observerTarget) { const observer = new MutationObserver((mutation) => { mutationCallback(); //console.log(mutation) //observer.disconnect(); }); function mutationCallback() { console.log("Mutation Callback Change") getMapInfo(halloween_map_id) .then(res => { generate(res); }) } observer.observe(observerTarget, { childList: true, subtree: true, }); } addStyles(` #minluck-button { margin-top: 5px; } .mi-uncaught-div { position: absolute; top: 38px; border: 2px solid darkseagreen; border-radius: 20px; width: 15px; height: 15px; color: white; text-align: center; z-index: 1; background: darkgreen; cursor: pointer; } .mi-caught-div { position: absolute; top: 38px; border: 2px solid mediumvioletred; border-radius: 20px; width: 15px; height: 15px; color: white; text-align: center; z-index: 1; background: darkred; cursor: pointer; } .mi-hunter-div { position: absolute; top: 62px ; width: 115px; left: 15px; } .mi-map-hunters { width: 25px; height: 25px; border-radius: 20px; margin-left: -5px; } }`) } }); function generate([cheese, hunters, mouse]) { document .querySelectorAll(".mi-uncaught-div") .forEach(el => el.remove()) document .querySelectorAll(".mi-hunter-div") .forEach(el => el.remove()) //insert var insertLocation = $(".halloweenBoilingCauldronHUD-bait"); for (var i = 0; i < cheese.length; i++) { //div for cheese var mouseDiv = document.createElement("div"); mouseDiv.className = cheese[i] == 0 ? "mi-caught-div" : "mi-uncaught-div" mouseDiv.innerText = cheese[i]; var mouseTitle = "Uncaught mice: " for (let k = 0; k < mouse[i].length; k++) { mouseTitle = mouseTitle + "\n" + mouse[i][k] } mouseDiv.title = mouseTitle; insertLocation[i].appendChild(mouseDiv); //another div for hunters var hunterDiv = document.createElement("div"); hunterDiv.className = "mi-hunter-div"; insertLocation[i].appendChild(hunterDiv); } //insert hunters for (let i = 0; i < hunters.length; i++) { var hunterPic = document.createElement("img"); hunterPic.className = "mi-map-hunters" hunterPic.src = hunters[i].profile_pic; hunterPic.title = hunters[i].name; var hDiv = $(".mi-hunter-div"); if (hunters[i].bait_name == "Monterey Jack-O-Lantern") { hDiv[1].appendChild(hunterPic); } else if (hunters[i].bait_name == "Bonefort Cheese") { hDiv[2].appendChild(hunterPic); } else if (hunters[i].bait_name == "Polter-Geitost") { hDiv[3].appendChild(hunterPic); } else if (hunters[i].bait_name == "Scream Cheese") { hDiv[4].appendChild(hunterPic); } else { hDiv[0].appendChild(hunterPic); } } } function getMapInfo(map_id) { debugging ? console.log("Gathering map mice information") : null; return new Promise((resolve, reject) => { postReq("https://www.mousehuntgame.com/managers/ajax/users/treasuremap.php", `sn=Hitgrab&hg_is_ajax=1&action=map_info&map_id=${map_id}&uh=${user.unique_hash}&last_read_journal_entry_id=${lastReadJournalEntryId}` ).then(res => { try { if (res) { //Step 1: Find the mice unique_ids var response = JSON.parse(res.responseText); //List of mice => try to find unique_id for comparison var treasure_mice = response.treasure_map.goals.mouse; debugging ? console.log("All mice list") : null; debugging ? console.log(treasure_mice) : null; //Step 2: Find the mice_unique ids which are caught var hunter_tab = response.treasure_map.hunters //console.log(hunter_tab); var caught_unique_id = []; for (var i = 0; i < hunter_tab.length; i++) { /* loop through an array within an array */ for (var j = 0; j < hunter_tab[i].completed_goal_ids.mouse.length; j++) { caught_unique_id.push(hunter_tab[i].completed_goal_ids.mouse[j]) } } debugging ? console.log("Mice caught list") : null; debugging ? console.log(caught_unique_id) : null; //Now we got all the unique_ids of mouse caught, let's get the remaining mice for (let i = 0; i < caught_unique_id.length; i++) { var index = treasure_mice.findIndex(mouse => mouse.unique_id == caught_unique_id[i]) treasure_mice.splice(index, 1); } debugging ? console.log("Unique Id of remaining mice") : null; debugging ? console.log(treasure_mice) : null; //Step 3:Which cheese? var cheese = [0, 0, 0, 0, 0] var cheese_array = response.user.quests.QuestHalloweenBoilingCauldron.mice; //Afterthought: I realise that the array give is not numerical var mouse = { [0]: [], [1]: [], [2]: [], [3]: [], [4]: [], } var converted_cheese_array = { [0]: cheese_array.cauldron_tier_1_cheese, [1]: cheese_array.cauldron_tier_2_cheese, [2]: cheese_array.cauldron_tier_3_cheese, [3]: cheese_array.cauldron_tier_4_cheese, } var converted_mouse_array = {} //reiterate over 4 tiers var j = 0; while (treasure_mice.length != 0) { var index = converted_cheese_array[j].findIndex(item => item.type == treasure_mice[0].type) if (index > -1) { //add 1 to cheese cheese[j] = cheese[j] + 1; //add 1 to mice list var initMice = mouse[j + 1]; initMice.push(treasure_mice[0].name); mouse[j + 1] = initMice; treasure_mice.splice(0, 1); j = 0; } else if (j < 3) { j++; } else { //Standard baitmi treasure_mice.splice(0, 1); cheese[4]++; var initMice = mouse[j]; initMice.push(treasure_mice[0].name); mouse[j + 1] = initMice; j = 0; } }; //rearrange, put standard bait at first position var std = cheese[4]; cheese.unshift(std); cheese.pop(); //mouse.unshift(stdm); //mouse.pop(); debugging ? console.log("Remaining order of cheese") : null; debugging ? console.log(cheese) : null; debugging ? console.log("Names of mice") : null; debugging ? console.log(mouse) : null; //Step 4: Get the hunters var hunters_active = [] for (let i = 0; i < hunter_tab.length; i++) { //var index = hunter_tab.findIndex(item => item.is_active == true); if (hunter_tab[i].is_active == true) { hunters_active.push(hunter_tab[i]); } } debugging ? console.log("Active hunters are") : null; debugging ? console.log(hunters_active) : null; resolve([cheese, hunters_active, mouse]); } } catch (error) { console.log(error) } }) }) } function postReq(url, form) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function () { if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { resolve(this); } }; xhr.onerror = function () { reject(this); }; xhr.send(form); }); };
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址