您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Extension for Hero Wars Helper. Modifies the adventure button to fetch the paths from https://www.solfors.com. You can choose any path listed and it will do it automatically. HeroWarsHelper
// ==UserScript== // @name HWHAdvExt // @namespace HWHAdvExt // @version 0.0.5 // @license Copyright ZingerY & orb // @description Extension for Hero Wars Helper. Modifies the adventure button to fetch the paths from https://www.solfors.com. You can choose any path listed and it will do it automatically. HeroWarsHelper // @author ZingerY // @match https://www.hero-wars.com/* // @match https://apps-1701433570146040.apps.fbsbx.com/* // @match https://www.solfors.com/* // @run-at document-start // @grant GM_xmlhttpRequest // @connect solfors.com // ==/UserScript== (function () { if (!this.HWHClasses) { console.log('%cHeroWarsHelper not found', 'color: red'); return; } console.log('%cHWH Adventure Extension loaded', 'color: green'); const { addExtentionName, getSaveVal, I18N, popup, setSaveVal } = HWHFuncs; addExtentionName(GM_info.script.name, GM_info.script.version, GM_info.script.author); // Store original getPath method const originalGetPath = HWHClasses.executeAdventure.prototype.getPath; // Override getPath method HWHClasses.executeAdventure.prototype.getPath = async function () { const oldVal = getSaveVal('adventurePath', ''); const keyPath = `adventurePath:${this.mapIdent}`; // Get paths from solfors.com const solforsPaths = await this.fetchSolforsPaths(); // Prepare popup buttons const popupButtons = [ { msg: I18N('START_ADVENTURE'), placeholder: '1,2,3,4,5,6', isInput: true, default: getSaveVal(keyPath, oldVal) }, { msg: I18N('BTN_CANCEL'), result: false, isCancel: true } ]; // Add Solfors path buttons if available if (solforsPaths) { ['blue', 'orange', 'green'].forEach(color => { if (solforsPaths[color]) { popupButtons.unshift({ msg: `${color === 'blue' ? '🔵' : color === 'orange' ? '🟠' : '🟢'} ${color.charAt(0).toUpperCase() + color.slice(1)}: ${solforsPaths[color]}`, result: solforsPaths[color], isPathButton: true }); } }); } const answer = await popup.confirm('SELECT PATH OR ENTER A CUSTOM PATH', popupButtons); if (!answer) { this.terminatеReason = I18N('BTN_CANCELED'); return false; } let path = answer.split(','); if (path.length < 2) { path = answer.split('-'); } if (path.length < 2) { this.terminatеReason = I18N('MUST_TWO_POINTS'); return false; } for (let p in path) { path[p] = +path[p].trim(); if (Number.isNaN(path[p])) { this.terminatеReason = I18N('MUST_ONLY_NUMBERS'); return false; } } if (!this.checkPath(path)) { return false; } setSaveVal(keyPath, answer); return path; }; // Method to fetch paths from solfors.com HWHClasses.executeAdventure.prototype.fetchSolforsPaths = async function () { try { // Get adventure ID const adventureInfo = await Caller.send('adventure_getInfo'); const adventureId = adventureInfo.adventureId; console.log('Current adventure:', adventureId); if (!adventureId || adventureId < 1 || adventureId > 12) { console.log('Invalid adventure ID'); return null; } const url = `https://www.solfors.com/adventure/${adventureId}`; console.log('Fetching paths from:', url); // Fetch page content const response = await new Promise((resolve) => { GM_xmlhttpRequest({ method: "GET", url: url, onload: resolve, onerror: () => resolve(null) }); }); if (!response || response.status !== 200) { console.log('Failed to fetch Solfors page'); return null; } // Improved path extraction const text = response.responseText.replace(/<[^>]*>/g, ' '); // Remove HTML tags const paths = {}; // Regex to capture the full path including optional Boss suffix const pathRegex = /(Blue|Orange|Green)\s*:\s*((?:\d+-)*\d+)(?:-Boss(?:\(x\d+\))?)?/gi; let match; while ((match = pathRegex.exec(text)) !== null) { const color = match[1].toLowerCase(); // Clean up the path - this now captures ONLY the numbers part (match[2]) let pathValue = match[2] // This is the captured numbers part only .trim() .replace(/\s+/g, ''); // Remove all whitespace paths[color] = pathValue; console.log(`Found ${color} path: ${pathValue}`); } if (Object.keys(paths).length === 0) { console.log('No paths found in page content'); console.log('Content sample:', text.substring(0, 500)); return null; } return paths; } catch (error) { console.error('Error in fetchSolforsPaths:', error); return null; } }; })();