Nexus Optimizer Pro

Maximiza FPS, reduce ping y optimiza el rendimiento en resurviv.biz y survev.io

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

Advertisement:

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

Advertisement:

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Nexus Optimizer Pro
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Maximiza FPS, reduce ping y optimiza el rendimiento en resurviv.biz y survev.io
// @author       ! System
// @icon         https://i.ibb.co/35RDsjMg/Chat-GPT-Image-12-jul-2026-13-15-49.png
// @match        *://survev.io/*
// @match        *://*.survev.io/*
// @match        *://resurviv.biz/*
// @match        *://*.resurviv.biz/*
// @license      MIT
// @run-at       document-end
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // ---------- CONFIGURACIÓN DE OPTIMIZACIONES ----------
    const OPT = {
        fpsUncap: true,
        disableInterpolation: true,
        disableHighResTex: true,
        disableScreenShake: true,
        reducePingInterval: true,
        webSocketBinary: true,
        hideMainMenuElements: true
    };

    const applied = {
        fpsUncap: false,
        interpolation: false,
        highResTex: false,
        screenShake: false,
        pingInterval: false,
        webSocketBinary: false,
        menuElementsHidden: false
    };

    const monitor = {
        fps: 0,
        ping: 0,
        players: 0,
        menuVisible: true
    };

    let fpsFrameCount = 0;
    let fpsLastTime = performance.now();

    // ---------- FUNCIONES DE BÚSQUEDA ----------
    function findConfig() {
        const paths = [
            () => window.config,
            () => window.ConfigManager?.config,
            () => window.game?.config,
            () => window.game?.m_config,
            () => window.g?.config,
            () => window.app?.config,
            () => window._config,
            () => window.surviv_config,
            () => window.resurviv_config
        ];
        for (let fn of paths) {
            try { const cfg = fn(); if (cfg && typeof cfg === 'object') return cfg; } catch(e) {}
        }
        return null;
    }

    function findGame() {
        const paths = [
            () => window.game,
            () => window.Game,
            () => window.g,
            () => window._game,
            () => window.app?.game,
            () => window.app
        ];
        for (let fn of paths) {
            try { const g = fn(); if (g && typeof g === 'object') return g; } catch(e) {}
        }
        return null;
    }

    function applyAllOptimizations() {
        const config = findConfig();
        const game = findGame();
        let anyApplied = false;

        // FPS Uncap
        if (OPT.fpsUncap) {
            try {
                if (game?.maxFps !== undefined && game.maxFps < 999) { game.maxFps = 999; applied.fpsUncap = true; anyApplied = true; }
                else if (game?.fpsMax !== undefined && game.fpsMax < 999) { game.fpsMax = 999; applied.fpsUncap = true; anyApplied = true; }
                else if (config?.maxFps !== undefined && config.maxFps < 999) { config.maxFps = 999; applied.fpsUncap = true; anyApplied = true; }
                else if (config?.fpsMax !== undefined && config.fpsMax < 999) { config.fpsMax = 999; applied.fpsUncap = true; anyApplied = true; }
            } catch(e) {}
        }

        // Interpolación
        if (OPT.disableInterpolation) {
            try {
                if (config?.interpolation !== undefined && config.interpolation !== false) { config.interpolation = false; applied.interpolation = true; anyApplied = true; }
                else if (typeof config?.set === 'function') { config.set('interpolation', false); applied.interpolation = true; anyApplied = true; }
            } catch(e) {}
        }

        // Texturas HD
        if (OPT.disableHighResTex) {
            try {
                if (config?.highResTex !== undefined && config.highResTex !== false) { config.highResTex = false; applied.highResTex = true; anyApplied = true; }
                else if (typeof config?.set === 'function') { config.set('highResTex', false); applied.highResTex = true; anyApplied = true; }
            } catch(e) {}
        }

        // Screen Shake
        if (OPT.disableScreenShake) {
            try {
                if (config?.screenShake !== undefined && config.screenShake !== false) { config.screenShake = false; applied.screenShake = true; anyApplied = true; }
                else if (typeof config?.set === 'function') { config.set('screenShake', false); applied.screenShake = true; anyApplied = true; }
            } catch(e) {}
        }

        // Ping Interval
        if (OPT.reducePingInterval) {
            const target = 100;
            try {
                if (config?.pingInterval !== undefined && config.pingInterval > target) { config.pingInterval = target; applied.pingInterval = true; anyApplied = true; }
                else if (typeof config?.set === 'function') { config.set('pingInterval', target); applied.pingInterval = true; anyApplied = true; }
            } catch(e) {}
        }

        // Ocultar elementos del menú principal
        if (OPT.hideMainMenuElements && !applied.menuElementsHidden) {
            try {
                const selectors = ['.main-menu-background','.menu-background-animation','.ad-container','.main-menu-video','#main-menu-ad'];
                let c = 0;
                selectors.forEach(sel => document.querySelectorAll(sel).forEach(el => { el.style.display = 'none'; c++; }));
                if (c > 0) { applied.menuElementsHidden = true; anyApplied = true; }
            } catch(e) {}
        }

        return anyApplied;
    }

    function updateFPS() {
        fpsFrameCount++;
        const now = performance.now();
        if (now - fpsLastTime >= 1000) {
            monitor.fps = Math.round((fpsFrameCount * 1000) / (now - fpsLastTime));
            fpsFrameCount = 0;
            fpsLastTime = now;
        }
        requestAnimationFrame(updateFPS);
    }

    function updatePlayers() {
        try {
            const el = document.querySelector('.js-ui-players-alive');
            if (el) {
                const n = parseInt(el.textContent.trim(), 10);
                if (!isNaN(n)) monitor.players = n;
            }
        } catch(e) {}
    }

    function setupPingDetection() {
        const OrigWebSocket = window.WebSocket;
        window.WebSocket = function(url, protocols) {
            const ws = new OrigWebSocket(url, protocols);
            if (typeof url === 'string' && (url.includes('ptc') || url.includes('gameId'))) {
                if (OPT.webSocketBinary) {
                    ws.binaryType = 'arraybuffer';
                    applied.webSocketBinary = true;
                }
                let lastSend = 0;
                const origSend = ws.send;
                ws.send = function(data) {
                    if (data instanceof ArrayBuffer && data.byteLength === 1) lastSend = performance.now();
                    return origSend.call(this, data);
                };
                ws.addEventListener('message', function(e) {
                    if (e.data instanceof ArrayBuffer && e.data.byteLength === 1 && lastSend > 0) {
                        monitor.ping = Math.round(performance.now() - lastSend);
                        lastSend = 0;
                    }
                });
            }
            return ws;
        };
    }

    function createMenu() {
        const menu = document.createElement('div');
        menu.id = 'nx-optimizer-menu';
        menu.innerHTML = `
            <div id="nx-opt-header">
                <span class="nx-opt-title">
                    <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                        <polygon points="12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2"/>
                        <line x1="12" y1="22" x2="12" y2="15.5"/>
                        <polyline points="22 8.5 12 15.5 2 8.5"/>
                    </svg>
                    Nexus Optimizer
                </span>
                <button id="nx-opt-close">
                    <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                        <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
                    </svg>
                </button>
            </div>
            <div id="nx-opt-body">
                <div class="nx-opt-row">
                    <span class="nx-opt-label"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20V10M18 20V4M6 20v-6"/></svg> FPS</span>
                    <span class="nx-opt-value" id="nx-fps">0</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="6" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg> Ping</span>
                    <span class="nx-opt-value" id="nx-ping">0 ms</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 00-3-3.87"/><path d="M16 3.13a4 4 0 010 7.75"/></svg> Players</span>
                    <span class="nx-opt-value" id="nx-players">0</span>
                </div>
                <hr>
                <div class="nx-opt-row">
                    <span class="nx-opt-label">FPS Uncap</span>
                    <span class="nx-opt-status" id="nx-uncap">✗</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label">Interpolation</span>
                    <span class="nx-opt-status" id="nx-interp">✗</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label">HighRes Tex</span>
                    <span class="nx-opt-status" id="nx-hires">✗</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label">Screen Shake</span>
                    <span class="nx-opt-status" id="nx-shake">✗</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label">Ping Interval</span>
                    <span class="nx-opt-status" id="nx-pingint">✗</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label">WebSocket Bin</span>
                    <span class="nx-opt-status" id="nx-wsbin">✗</span>
                </div>
                <div class="nx-opt-row">
                    <span class="nx-opt-label">Menu Clean</span>
                    <span class="nx-opt-status" id="nx-hidemen">✗</span>
                </div>
            </div>
        `;

        const style = document.createElement('style');
        style.textContent = `
            #nx-optimizer-menu {
                position: fixed;
                top: 20px;
                right: 20px;
                width: 260px;
                background: rgba(18, 18, 24, 0.92);
                backdrop-filter: blur(14px);
                -webkit-backdrop-filter: blur(14px);
                border: 1px solid rgba(255,255,255,0.08);
                border-radius: 16px;
                color: #f0f0f0;
                font-family: 'Segoe UI', 'Inter', system-ui, sans-serif;
                font-size: 13px;
                z-index: 99999;
                box-shadow: 0 8px 32px rgba(0,0,0,0.6);
                display: flex;
                flex-direction: column;
                overflow: hidden;
                animation: nxSlideIn 0.3s ease-out;
            }
            @keyframes nxSlideIn {
                from { opacity: 0; transform: translateY(-10px); }
                to { opacity: 1; transform: translateY(0); }
            }
            #nx-opt-header {
                display: flex;
                justify-content: space-between;
                align-items: center;
                padding: 8px 12px;
                background: rgba(10, 10, 14, 0.95);
                border-bottom: 1px solid rgba(255,255,255,0.08);
                font-weight: 600;
                font-size: 14px;
            }
            .nx-opt-title {
                display: flex;
                align-items: center;
                gap: 8px;
                color: #ccc;
            }
            .nx-opt-title svg {
                color: #ff4444;
            }
            #nx-opt-close {
                background: none;
                border: none;
                color: #888;
                cursor: pointer;
                padding: 2px;
                display: flex;
                align-items: center;
                transition: color 0.2s;
            }
            #nx-opt-close:hover { color: #fff; }
            #nx-opt-body {
                padding: 12px 14px;
            }
            .nx-opt-row {
                display: flex;
                justify-content: space-between;
                align-items: center;
                margin-bottom: 8px;
            }
            .nx-opt-label {
                display: flex;
                align-items: center;
                gap: 6px;
                color: #aaa;
            }
            .nx-opt-label svg {
                color: #888;
            }
            .nx-opt-value {
                font-weight: 600;
                color: #fff;
            }
            .nx-opt-status {
                font-weight: 600;
                font-size: 14px;
            }
            .nx-opt-status:contains('✓') { color: #4caf50; }
            hr {
                border: 0.5px solid rgba(255,255,255,0.08);
                margin: 8px 0;
            }
        `;
        document.head.appendChild(style);
        document.body.appendChild(menu);

        // Eventos
        document.getElementById('nx-opt-close').addEventListener('click', () => {
            menu.style.display = 'none';
            monitor.menuVisible = false;
        });

        document.addEventListener('keydown', (e) => {
            if (e.key === 'p' || e.key === 'P') {
                monitor.menuVisible = !monitor.menuVisible;
                menu.style.display = monitor.menuVisible ? 'flex' : 'none';
            }
        });

        // Actualizar cada segundo
        setInterval(() => {
            document.getElementById('nx-fps').textContent = monitor.fps;
            document.getElementById('nx-ping').textContent = monitor.ping + ' ms';
            document.getElementById('nx-players').textContent = monitor.players;

            document.getElementById('nx-uncap').textContent = applied.fpsUncap ? '✓' : '✗';
            document.getElementById('nx-uncap').style.color = applied.fpsUncap ? '#4caf50' : '#ff4444';
            document.getElementById('nx-interp').textContent = applied.interpolation ? '✓' : '✗';
            document.getElementById('nx-interp').style.color = applied.interpolation ? '#4caf50' : '#ff4444';
            document.getElementById('nx-hires').textContent = applied.highResTex ? '✓' : '✗';
            document.getElementById('nx-hires').style.color = applied.highResTex ? '#4caf50' : '#ff4444';
            document.getElementById('nx-shake').textContent = applied.screenShake ? '✓' : '✗';
            document.getElementById('nx-shake').style.color = applied.screenShake ? '#4caf50' : '#ff4444';
            document.getElementById('nx-pingint').textContent = applied.pingInterval ? '✓' : '✗';
            document.getElementById('nx-pingint').style.color = applied.pingInterval ? '#4caf50' : '#ff4444';
            document.getElementById('nx-wsbin').textContent = applied.webSocketBinary ? '✓' : '✗';
            document.getElementById('nx-wsbin').style.color = applied.webSocketBinary ? '#4caf50' : '#ff4444';
            document.getElementById('nx-hidemen').textContent = applied.menuElementsHidden ? '✓' : '✗';
            document.getElementById('nx-hidemen').style.color = applied.menuElementsHidden ? '#4caf50' : '#ff4444';

            updatePlayers();
        }, 1000);
    }

    function tryApply() {
        const ok = applyAllOptimizations();
        if (!ok) {
            setTimeout(tryApply, 3000);
        } else {
            setTimeout(tryApply, 10000);
        }
    }

    function init() {
        console.log('[Nexus Optimizer] Starting...');
        setupPingDetection();
        updateFPS();
        createMenu();
        setTimeout(tryApply, 2000);
    }

    if (document.readyState === 'complete' || document.readyState === 'interactive') {
        init();
    } else {
        window.addEventListener('DOMContentLoaded', init);
    }
})();