您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Utility functions and constants for FarmRPG Helper scripts
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/534607/1581181/FarmRPG%20Helper%20Utils.js
- // ==UserScript==
- // @name FarmRPG Helper Utils
- // @namespace https://gf.qytechs.cn/users/1114461
- // @version 1.0.0
- // @description Utility functions and constants for FarmRPG Helper scripts
- // @author Fewfre
- // @license GNU GPLv3
- // @grant unsafeWindow
- // ==/UserScript==
- (function() {
- 'use strict';
- // START OF SECTION: Initial Setup and Polyfills
- // Note: localStorage is inherently global, no need to export.
- // Consider if this needs to run in the Utils script or only the main one.
- // If multiple scripts might use it, keeping it here is fine.
- localStorage.setItem('fewfh-enable-all', "1");
- (function () { const e = document.createElement("link").relList; if (e && e.supports && e.supports("modulepreload")) return; for (const i of document.querySelectorAll('link[rel="modulepreload"]')) s(i); new MutationObserver(i => { for (const l of i) if (l.type === "childList") for (const r of l.addedNodes) r.tagName === "LINK" && r.rel === "modulepreload" && s(r) }).observe(document, { childList: !0, subtree: !0 }); function t(i) { const l = {}; return i.integrity && (l.integrity = i.integrity), i.referrerPolicy && (l.referrerPolicy = i.referrerPolicy), i.crossOrigin === "use-credentials" ? l.credentials = "include" : i.crossOrigin === "anonymous" ? l.credentials = "omit" : l.credentials = "same-origin", l } function s(i) { if (i.ep) return; i.ep = !0; const l = t(i); fetch(i.href, l) } })();
- // END OF SECTION: Initial Setup and Polyfills
- // START OF SECTION: App Wrapper (Q)
- var Q_internal; (n => { const e = (typeof unsafeWindow < "u" ? unsafeWindow : window).myApp; function t(r, o) { e.onPageInit(r, o) } n.onPageInit = t; function s(r, o) { e.onPageBeforeRemove(r, o) } n.onPageBeforeRemove = s; function i(r, o) { let a = null; n.onPageInit("*", c => { a === r && c.name !== r && o(c), a = c.name }) } n.onPageExit = i; function l() { e.mainView.router.refreshPage() } n.refreshPage = l })(Q_internal || (Q_internal = {}));
- // Export Q to the window object for other scripts to use
- unsafeWindow.Q = Q_internal;
- // END OF SECTION: App Wrapper (Q)
- // START OF SECTION: Constants (de)
- var de_internal; (n => {
- var audioCtx;
- // Keep _e local if only used here
- function _e(n, e) { return Math.random() * (e - n) + n }
- unsafeWindow._e = _e;
- function playBeepInternal(duration = 150, frequency = 1000, volume = 0.3, type = 'sine') {
- try {
- if (!audioCtx || audioCtx.state === 'closed') {
- audioCtx = new (window.AudioContext || window.webkitAudioContext)();
- }
- if (audioCtx.state === 'suspended') {
- audioCtx.resume();
- }
- const oscillator = audioCtx.createOscillator();
- const gainNode = audioCtx.createGain();
- oscillator.connect(gainNode);
- gainNode.connect(audioCtx.destination);
- oscillator.type = type;
- oscillator.frequency.setValueAtTime(frequency, audioCtx.currentTime);
- const now = audioCtx.currentTime;
- const attackTime = 0.01; // 10ms fade in
- const decayTime = 0.01; // 10ms fade out
- const beepEndTime = now + duration / 1000;
- gainNode.gain.setValueAtTime(0, now);
- gainNode.gain.linearRampToValueAtTime(volume, now + attackTime);
- gainNode.gain.setValueAtTime(volume, beepEndTime - decayTime);
- gainNode.gain.linearRampToValueAtTime(0.0001, beepEndTime);
- oscillator.start(now);
- oscillator.stop(beepEndTime);
- oscillator.onended = () => {
- oscillator.disconnect();
- gainNode.disconnect();
- };
- } catch (e) {
- console.error("FarmRPG Helper Utils: Error playing beep sound.", e);
- // Fail silently if Web Audio API not supported or fails
- }
- }
- n.SOUND_FINISHED = {
- play: function() {
- playBeepInternal(); // Uses default beep parameters
- }
- // Add other methods like pause(), etc., if needed
- };
- // Assuming the chevron image is still needed, keep it.
- n.IMAGE_CEVRON_RIGHT = "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PScwIDAgNjAgMTIwJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J202MCA2MS41LTM4LjI1IDM4LjI1LTkuNzUtOS43NSAyOS4yNS0yOC41LTI5LjI1LTI4LjUgOS43NS05Ljc1eicgZmlsbD0nI2M3YzdjYycvPjwvc3ZnPg==";
- })(de_internal || (de_internal = {}));
- // Export de to the window object for other scripts to use
- unsafeWindow.de = de_internal;
- // END OF SECTION: Constants (de)
- // START OF SECTION: Utility Functions
- // Keep _e local as it's only used by V and ft within this script
- function _e(n, e) { return Math.random() * (e - n) + n }
- async function V_internal(n, e) { return new Promise(t => { setTimeout(t, e ? _e(n * 1e3, e * 1e3) : n * 1e3) }) }
- unsafeWindow.V = V_internal; // Export V
- function ft_internal(n, e) { let t, s; return { promise: new Promise(l => { s = l, t = setTimeout(l, e ? _e(n * 1e3, e * 1e3) : n * 1e3) }), timeoutId: t, cancel() { clearTimeout(t), s() } } }
- unsafeWindow.ft = ft_internal; // Export ft
- function ve_internal(n, e = {}) { return new Promise((t, s) => { const i = r => $(r).is(":visible") && parseInt($(r).css("opacity")) > .1; if ($(n).length && (!e.visible || i(n))) return t($(n + ":visible").first()[0]); const l = new MutationObserver(r => { $(n).length && (!e.visible || i(n)) && (t($(n + ":visible").first()[0]), l.disconnect()) }); e.timeout && V_internal(e.timeout).then(() => { l.disconnect(), s(new Error("observer timed out")) }), l.observe(e.target || document.body, { attributes: !0, childList: !0, subtree: !0, ...e.config }) }) }
- unsafeWindow.ve = ve_internal; // Export ve
- async function we_internal(n, e) { return fetch(`worker.php?go=buyitem&id=${n}&qty=${e}`, { method: "POST" }).then(t => t.text()).then(t => Number.isNaN(Number.parseInt(t)) ? t : we_internal(n, t)) }
- unsafeWindow.we = we_internal; // Export we
- const le_internal = { farming: 0, fishing: 0, crafting: 0, exploring: 0, cooking: 0 };
- unsafeWindow.le = le_internal; // Export le
- function st_internal() {
- // Assumes jQuery ($) is available globally
- if (typeof $ === 'undefined') {
- console.error("FarmRPG Helper Utils: jQuery ($) is not defined. Cannot update skill levels.");
- return le_internal;
- }
- if ($('[href="progress.php?type=Farming"]').length) {
- le_internal.farming = parseInt($('[href="progress.php?type=Farming"]').parent().text().replaceAll(/[^\d]/g, "") || "0");
- le_internal.fishing = parseInt($('[href="progress.php?type=Fishing"]').parent().text().replaceAll(/[^\d]/g, "") || "0");
- le_internal.crafting = parseInt($('[href="progress.php?type=Crafting"]').parent().text().replaceAll(/[^\d]/g, "") || "0");
- le_internal.exploring = parseInt($('[href="progress.php?type=Exploring"]').parent().text().replaceAll(/[^\d]/g, "") || "0");
- le_internal.cooking = parseInt($('[href="progress.php?type=Cooking"]').parent().text().replaceAll(/[^\d]/g, "") || "0");
- }
- return le_internal;
- }
- unsafeWindow.st = st_internal; // Export st
- // END OF SECTION: Utility Functions
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址