// ==UserScript== // @name 通用时间加速器(诊断修复版) // @namespace http://tampermonkey.net/ // @version 1.4 // @description 修复未开启就暂停的致命Bug // @author ZMM // @match *://*/* // @grant none // @run-at document-start // ==/UserScript== (function () { 'use strict'; /* ========== 配置 ========== */ const CFG_KEY = '__time_cheat_cfg__'; let cfg = { enabled: false, multiplier: 2 }; try { cfg = Object.assign(cfg, JSON.parse(localStorage.getItem(CFG_KEY) || '{}')); } catch (e) {} /* ========== 核心:绝对不停滞的时间引擎 ========== */ const OrigPerfNow = performance.now.bind(performance); let lastRealTime = OrigPerfNow(); let fakeTime = lastRealTime; // 1. 劫持 performance.now performance.now = function() { const realNow = OrigPerfNow(); const delta = realNow - lastRealTime; lastRealTime = realNow; // 防止切后台回来导致时间跳跃过大 if (delta > 0 && delta < 1000) { // 关键:即使没开启(cfg.enabled=false),也乘以1,保证时间正常流动! fakeTime += delta * (cfg.enabled ? (Number(cfg.multiplier) || 1) : 1); } else { fakeTime = realNow; // 发生异常跳跃,直接对齐真实时间 } return fakeTime; }; // 2. 劫持 Date.now (致命修复:必须跟着 performance.now 走,不能独立返回死变量) Date.now = function() { return Math.floor(performance.now()); }; /* ========== 注入 UI ========== */ function injectUI() { const css = document.createElement('style'); css.textContent = ` #tc-btn{ position:fixed; z-index:2147483647; width:42px; height:42px; border-radius:50%; border:2px solid #4CAF50; background:linear-gradient(135deg,#2E7D32,#4CAF50); color:#fff; font:bold 18px/42px sans-serif; text-align:center; cursor:pointer; user-select:none; box-shadow:0 2px 12px rgba(0,0,0,.6); right:16px; top:16px; touch-action:none; } #tc-pnl{ position:fixed; z-index:2147483646; right:70px; top:16px; width:260px; background:rgba(30,30,30,.96); border:1.5px solid #4CAF50; border-radius:10px; box-shadow:0 4px 20px rgba(0,0,0,.7); font:13px/1.5 sans-serif; color:#e0e0e0; padding:14px; transition:opacity .2s,transform .2s; transform-origin:top right; } #tc-pnl.tc-h{ opacity:0; transform:scale(.9); pointer-events:none; } .tc-t{ display:flex; align-items:center; gap:8px; margin-bottom:12px; cursor:pointer; } .tc-t input{ display:none; } .tc-s{ position:relative; width:36px; height:20px; border-radius:10px; background:rgba(255,255,255,.15); transition:background .2s; flex-shrink:0; } .tc-s::after{ content:''; position:absolute; top:2px; left:2px; width:16px; height:16px; border-radius:50%; background:#888; transition:transform .2s; } .tc-t input:checked+.tc-s{ background:rgba(76,175,80,.4); } .tc-t input:checked+.tc-s::after{ transform:translateX(16px); background:#4CAF50; } .tc-r{ display:flex; justify-content:space-between; align-items:center; margin-bottom:10px; } .tc-r label{ color:#bbb; font-size:12px; } .tc-r input[type=number]{ width:80px; padding:4px 6px; border:1px solid #4CAF50; border-radius:4px; background:rgba(0,0,0,.4); color:#fff; font:13px monospace; outline:none; text-align:right; } .tc-btn2{ display:block; width:100%; padding:8px; border:none; border-radius:6px; background:#4CAF50; color:#000; font:bold 13px sans-serif; cursor:pointer; margin-top:4px; } .tc-hint{ text-align:center; font-size:11px; color:#888; margin-top:8px; } .tc-close{ position:absolute; top:8px; right:10px; background:none; border:none; color:#4CAF50; font-size:18px; cursor:pointer; } `; document.head.appendChild(css); const btn = document.createElement('div'); btn.id = 'tc-btn'; btn.textContent = '⏩'; document.body.appendChild(btn); const pnl = document.createElement('div'); pnl.id = 'tc-pnl'; pnl.classList.add('tc-h'); pnl.innerHTML = `