60fps bugfix

Literally the best mod ever made. Makes 60fps not only playable, it feels exactly the same as 240fps while *reducing* lag and ping instead of increasing it. Fullscreen recommended. Keywords: starblast.io starblast dueling mod fps bypass unlock uncap if you want more than 60fps, please instead use this mod, it'll solve all your problems.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         60fps bugfix
// @namespace    http://tampermonkey.net/
// @version      2.113
// @description  Literally the best mod ever made. Makes 60fps not only playable, it feels exactly the same as 240fps while *reducing* lag and ping instead of increasing it. Fullscreen recommended. Keywords: starblast.io starblast dueling mod fps bypass unlock uncap if you want more than 60fps, please instead use this mod, it'll solve all your problems.
// @author       ✨Stardust™
// @match        *://starblast.io/*
// @exclude      *://starblast.io/modding.html*
// @exclude      *://starblast.io/shipeditor*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // URL for your modified index.html file
    const modifiedIndexUrl = 'https://raw.githubusercontent.com/StardustSDF/60fps-bugfix-starblast/main/index.html';
    // The above URL includes lowercase name mod, as well as the following altercation to the game code:
    // e.prototype.lII0O=function(t){var e,i,s;let now=Date.now();if(now-lastTime<1000/20){clearTimeout(this.stopTimer);this.stopTimer=setTimeout(()=>{i=(t.clientX-this.element.offsetLeft)*this.l01II,s=(t.clientY-this.element.offsetTop)*this.l01II,this.mousepressed?this.O01lI(i,s,"mouse"):this.mouseMove(i,s,"mouse"),this.control_listener&&this.control_listener.mouseMove(i,s,t);},50);return!1;}lastTime=now;t.preventDefault(),i=(t.clientX-this.element.offsetLeft)*this.l01II,s=(t.clientY-this.element.offsetTop)*this.l01II,e=this.mousepressed?this.O01lI(i,s,"mouse"):this.mouseMove(i,s,"mouse"),e||null!=this.control_listener&&this.control_listener.mouseMove(i,s,t),clearTimeout(this.stopTimer),this.stopTimer=setTimeout(()=>{i=(t.clientX-this.element.offsetLeft)*this.l01II,s=(t.clientY-this.element.offsetTop)*this.l01II,this.mousepressed?this.O01lI(i,s,"mouse"):this.mouseMove(i,s,"mouse"),this.control_listener&&this.control_listener.mouseMove(i,s,t);},50),!1},
    // and let lastTime = 0; at the beginning of the main js for the game
    function applyModifiedIndex() {
        fetch(modifiedIndexUrl)
            .then(response => {
                if (response.ok) {
                    return response.text();
                } else {
                    throw new Error('An error? In my userscript?!');
                }
            })
            .then(html => {
                document.open();
                document.write(html);
                document.close();
                applyCustomCursor();
            })
            .catch(error => {
                console.error('An error? In my userscript?!:', error);
            });
    }

    function applyCustomCursor() {
        const cursorTrailCount = 2;
        const trailElements = [];
        const trailDelay = 5;
        const edgeThreshold = 3;

        for (let i = 0; i < cursorTrailCount; i++) {
            const trail = document.createElement('div');
            trail.style.position = 'fixed';
            trail.style.width = '24px';
            trail.style.height = '24px';
            trail.style.backgroundImage = 'url(https://raw.githubusercontent.com/StardustSDF/60fps-bugfix-starblast/main/crosshair4.png)';
            trail.style.backgroundSize = 'contain';
            trail.style.pointerEvents = 'none';
            trail.style.opacity = '1';
            trail.style.transform = 'translate(-50%, -50%)';
            trail.style.zIndex = '69420';
            document.body.appendChild(trail);
            trailElements.push(trail);
        }

        let mouseX = 0, mouseY = 0;
        let trailPositions = Array(cursorTrailCount).fill({ x: 0, y: 0 });

        function updateCursorTrail() {
            trailPositions = [{ x: mouseX, y: mouseY }, ...trailPositions.slice(0, cursorTrailCount - 1)];

            trailElements.forEach((trail, index) => {
                setTimeout(() => {
                    trail.style.left = `${trailPositions[index].x}px`;
                    trail.style.top = `${trailPositions[index].y}px`;

                    if (
                        trailPositions[index].x <= edgeThreshold ||
                        trailPositions[index].x >= window.innerWidth - edgeThreshold ||
                        trailPositions[index].y <= edgeThreshold ||
                        trailPositions[index].y >= window.innerHeight - edgeThreshold
                    ) {
                        trail.style.opacity = '0';
                    } else {
                        trail.style.opacity = '1';
                    }
                }, index * trailDelay);
            });

            requestAnimationFrame(updateCursorTrail);
        }

        updateCursorTrail();

        window.addEventListener('mousemove', (event) => {
            mouseX = event.clientX;
            mouseY = event.clientY;
        });

        const style = document.createElement('style');
        style.innerHTML = `
            * {
                cursor: none !important;
            }
            .sbg-crosshair {
                visibility: visible !important;
            }
        `;
        document.head.appendChild(style);
    }

    window.addEventListener('load', applyModifiedIndex);
})();