Wormax.IO Universal Zoom (Browser Compatible)

Smooth, stutter-free zoom for Wormax.IO that works across browsers and clients (Chrome, Firefox, Edge, etc.). Auto-detects camera and adapts to page timing.

À partir de 2025-07-13. Voir la dernière version.

// ==UserScript==
// @name         Wormax.IO Universal Zoom (Browser Compatible)
// @namespace    http://tampermonkey.net/
// @version      3.0
// @description  Smooth, stutter-free zoom for Wormax.IO that works across browsers and clients (Chrome, Firefox, Edge, etc.). Auto-detects camera and adapts to page timing.
// @author       AdamStorme
// @match        *://*.wormax.io/*
// @grant        unsafeWindow
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    const root = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window;

    let zoomTarget = 1.0;
    let zoomCurrent = 1.0;
    let cameraController = null;

    function findCameraController() {
        const stack = [root];
        const visited = new WeakSet();

        while (stack.length) {
            const obj = stack.pop();
            if (!obj || typeof obj !== 'object' || visited.has(obj)) continue;
            visited.add(obj);

            for (const key in obj) {
                try {
                    const val = obj[key];
                    if (
                        val &&
                        typeof val === 'object' &&
                        val.camera &&
                        typeof val.camera.zoom === 'number' &&
                        'updateZoom' in val &&
                        'follow' in val
                    ) {
                        return val;
                    }
                    if (val && typeof val === 'object') {
                        stack.push(val);
                    }
                } catch {}
            }
        }
        return null;
    }

    function applySmoothZoom(camera) {
        function step() {
            const diff = zoomTarget - zoomCurrent;
            zoomCurrent += diff * 0.1;
            if (Math.abs(diff) < 0.001) zoomCurrent = zoomTarget;

            camera.zoom = zoomCurrent;
            camera.update?.();

            requestAnimationFrame(step);
        }
        requestAnimationFrame(step);
    }

    function setupInput() {
        window.addEventListener('wheel', (e) => {
            const step = e.altKey ? 0.1 : e.shiftKey ? 1.0 : 0.2;
            zoomTarget = Math.max(0.1, Math.min(5.0, zoomTarget + (e.deltaY > 0 ? step : -step)));
            e.preventDefault();
        }, { passive: false });

        document.addEventListener('keydown', (e) => {
            if (e.key.toLowerCase() === 'r') {
                zoomTarget = 1.0;
                console.log('[ZoomMod] Zoom reset');
            }
        });
    }

    function initZoomController() {
        const tryInterval = setInterval(() => {
            const controller = findCameraController();
            if (controller && controller.camera && typeof controller.camera.zoom === 'number') {
                clearInterval(tryInterval);
                cameraController = controller;
                controller.updateZoom = false;

                setupInput();
                applySmoothZoom(controller.camera);

                console.log('[ZoomMod] Zoom initialized');
            }
        }, 1000);
    }

    initZoomController();
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。