// ==UserScript== // @name 通用时间加速器(修复倍率修改) // @namespace http://tampermonkey.net/ // @version 1.9 // @description 修复倍率无法修改问题,确保配置同步 // @author ZMM // @match *://*/* // @grant none // @run-at document-start // ==/UserScript== (function () { 'use strict'; /* ========== 配置持久化 ========== */ const CFG_KEY = '__time_cheat_cfg__'; const defaultCfg = { enabled: false, multiplier: 2 // 默认2倍速 }; let cfg = Object.assign({}, defaultCfg); try { cfg = Object.assign(cfg, JSON.parse(localStorage.getItem(CFG_KEY) || '{}')); } catch (e) { localStorage.removeItem(CFG_KEY); } function saveCfg() { localStorage.setItem(CFG_KEY, JSON.stringify(cfg)); } /* ========== 核心:绝对稳定的时间加速引擎 ========== */ // 1. 保存原始函数(关键:Date.now 必须恢复原始行为) const OrigPerfNow = performance.now.bind(performance); const OrigDateNow = Date.now; // 2. 初始化时间引擎变量 let lastRealPerfTime = OrigPerfNow(); let fakePerfTime = lastRealPerfTime; let timeEngineEnabled = false; // 3. 劫持 performance.now(仅用于游戏逻辑加速) function safePerfNow() { const realNow = OrigPerfNow(); const delta = realNow - lastRealPerfTime; lastRealPerfTime = realNow; // 防止时间跳跃过大(如切后台再切回来) if (delta > 0 && delta < 10000) { // 允许10秒内的跳跃,避免异常重置 if (timeEngineEnabled) { const multiplier = Number(cfg.multiplier) || 1; fakePerfTime += delta * multiplier; } else { fakePerfTime += delta; // 即使没开启,也要让 fakePerfTime 跟上真实时间,避免停滞 } } else { // 跳跃过大,直接对齐真实时间,避免负数 fakePerfTime = realNow; } return fakePerfTime; } // 4. 劫持 Date.now(关键修复:恢复原始行为,不再依赖 performance.now) Date.now = OrigDateNow; // 直接使用原始 Date.now,返回系统当前时间 // 5. 启用/禁用时间引擎 function enableTimeEngine() { timeEngineEnabled = true; performance.now = safePerfNow; // 启用加速 } function disableTimeEngine() { timeEngineEnabled = false; performance.now = OrigPerfNow; // 恢复原始 performance.now } /* ========== 注入 UI:可移动浮窗(彻底修复)