Bonk.io RainbowStyle Enhanced

Adds a shared rainbow effect to the name, level, and the word 'level' in Bonk.io, visible to other users with this script.

当前为 2024-12-16 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Bonk.io RainbowStyle Enhanced
// @namespace    http://tampermonkey.net/
// @version      8.5.7
// @description  Adds a shared rainbow effect to the name, level, and the word 'level' in Bonk.io, visible to other users with this script.
// @author       YourName
// @match        *://bonk.io/*
// @grant        GM_addStyle
// ==/UserScript==

(function () {
    'use strict';

    console.log("Enhanced RainbowStyle script loaded!");

    // Rainbow color generator
    function generateRainbowColor(hue) {
        return `hsl(${hue}, 100%, 50%)`;
    }

    // Apply rainbow effect to an element (name, level, or "level" label)
    function startRainbowEffect(targetElement) {
        let hue = 0;
        const interval = setInterval(() => {
            hue = (hue + 5) % 360; // Cycle through hues
            targetElement.style.color = generateRainbowColor(hue);
        }, 100); // Update every 100ms
        return interval;
    }

    // Broadcast the RainbowStyle command via DOM
    function broadcastRainbowStyle(playerName) {
        const signal = document.createElement('div');
        signal.className = 'rainbow-command';
        signal.dataset.playerName = playerName;
        signal.style.display = 'none'; // Hidden element
        document.body.appendChild(signal);

        setTimeout(() => signal.remove(), 100); // Remove signal after broadcasting
    }

    // Listen for RainbowStyle broadcasts
    function listenForRainbowCommands() {
        const observer = new MutationObserver((mutations) => {
            for (const mutation of mutations) {
                mutation.addedNodes.forEach((node) => {
                    if (node.className === 'rainbow-command') {
                        const playerName = node.dataset.playerName;
                        applyRainbowToPlayer(playerName);
                    }
                });
            }
        });

        observer.observe(document.body, { childList: true, subtree: true });
    }

    // Apply the rainbow effect to a player by their name
    function applyRainbowToPlayer(playerName) {
        const playerElements = findPlayerElementsByName(playerName);
        if (playerElements) {
            console.log(`Applying rainbow effect to ${playerName}`);
            // Apply to all relevant parts: name, level, and "level" label
            if (playerElements.name) startRainbowEffect(playerElements.name);
            if (playerElements.level) startRainbowEffect(playerElements.level);
            if (playerElements.levelLabel) startRainbowEffect(playerElements.levelLabel);
        } else {
            console.warn(`Player elements for ${playerName} not found!`);
        }
    }

    // Find the elements corresponding to a player's name, level, and "level" label
    function findPlayerElementsByName(playerName) {
        const playerList = document.querySelectorAll('.playerContainer'); // Adjust to Bonk.io structure
        for (const playerContainer of playerList) {
            const nameElement = playerContainer.querySelector('.playerName'); // Name element
            if (nameElement && nameElement.textContent.trim() === playerName) {
                // Assuming level and label are siblings of the name element; adjust selectors as needed
                const levelElement = playerContainer.querySelector('.playerLevel');
                const levelLabelElement = playerContainer.querySelector('.levelLabel');
                return {
                    name: nameElement,
                    level: levelElement,
                    levelLabel: levelLabelElement
                };
            }
        }
        return null;
    }

    // Monitor chat for the !rainbowstyle command
    function monitorChat() {
        const chatBox = document.querySelector(".chatBox"); // Adjust selector
        if (!chatBox) {
            console.warn("Chat box not found!");
            return;
        }

        chatBox.addEventListener("keydown", (event) => {
            if (event.key === "Enter") {
                const chatInput = chatBox.value;
                if (chatInput.startsWith("!rainbowstyle")) {
                    const playerName = getLocalPlayerName(); // Get your own name
                    broadcastRainbowStyle(playerName);
                }
                chatBox.value = ""; // Clear input
            }
        });
    }

    // Get the local player's name
    function getLocalPlayerName() {
        const localPlayer = document.querySelector('.localPlayerName'); // Adjust selector
        return localPlayer ? localPlayer.textContent.trim() : "UnknownPlayer";
    }

    // Wait for game to load, then initialize
    function init() {
        const gameLoadedCheck = setInterval(() => {
            const chatBox = document.querySelector(".chatBox"); // Adjust selector
            if (chatBox) {
                clearInterval(gameLoadedCheck);
                listenForRainbowCommands();
                monitorChat();
                console.log("Enhanced RainbowStyle initialized!");
            }
        }, 1000); // Check every second
    }

    // Start the script
    init();
})();