Wormax.IO Zoom [WORKS ONLY ON THORIUM] [Stutter fix]

Stutter and respawn fix!

Version au 13/07/2025. Voir la dernière version.

// ==UserScript==
// @name         Wormax.IO Zoom [WORKS ONLY ON THORIUM] [Stutter fix]
// @namespace    http://tampermonkey.net/
// @version      3.3
// @description  Stutter and respawn fix! 
// @author       AdamStorme
// @match        *://*.wormax.io/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    const script = document.createElement('script');
    script.textContent = '(' + function () {
        let zoomTarget = 1.0;
        let zoomCurrent = 1.0;
        let currentController = null;
        let cameraPatched = false;

        function findCameraController() {
            const stack = [window];
            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 patchZoomProperty(camera) {
            try {
                Object.defineProperty(camera, 'zoom', {
                    get: () => zoomCurrent,
                    set: (v) => {
                        // Only allow our script to control the zoom
                        zoomTarget = Math.max(0.1, Math.min(5.0, v));
                    },
                    configurable: true
                });
                cameraPatched = true;
                console.log('[ZoomMod] camera.zoom patched');
            } catch (e) {
                console.warn('[ZoomMod] Failed to patch zoom property:', e);
            }
        }

        function smoothZoomLoop(camera) {
            const step = () => {
                const diff = zoomTarget - zoomCurrent;
                zoomCurrent += diff * 0.15;
                if (Math.abs(diff) < 0.0005) zoomCurrent = zoomTarget;

                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 observeCameraChanges() {
            setInterval(() => {
                const controller = findCameraController();
                if (
                    controller &&
                    controller.camera &&
                    typeof controller.camera.zoom === 'number' &&
                    controller !== currentController
                ) {
                    currentController = controller;
                    controller.updateZoom = false;
                    cameraPatched = false;

                    try {
                        patchZoomProperty(controller.camera);
                        smoothZoomLoop(controller.camera);
                        console.log('[ZoomMod] Camera re-hooked after respawn');
                    } catch (e) {
                        console.warn('[ZoomMod] Re-hooking failed:', e);
                    }
                }
            }, 500); // check for changes twice a second
        }

        setupInput();
        observeCameraChanges();
    } + ')();';

    document.body.appendChild(script);
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。