!! ~ Player Joined Notifications &&& Server's Player List ~ !!

Find your friends easily in sploop.io! The first script of its type 🤯😁😎✌️. Press Semicolum " ; " to toggle the aesthetic player list and select the theme of your choice!

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

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

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

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

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

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         !! ~ Player Joined Notifications &&& Server's Player List ~ !!
// @name:ru      !! ~ Уведомления о присоединении игроков []И[] Список игроков на сервере ~ !!
// @name:vi      !! ~ Thông báo Người chơi tham gia []VÀ[] Danh sách Người chơi trên Máy chủ ~ !!
// @name:zh      !! ~ 玩家加入通知 []和[] 服务器的玩家列表 ~ !!
// @namespace    http://tampermonkey.net/
// @version      2024-04-23
// @description  Find your friends easily in sploop.io! The first script of its type 🤯😁😎✌️. Press Semicolum " ; " to toggle the aesthetic player list and select the theme of your choice!
// @description:ru  Легко находите своих друзей в sploop.io! Первый скрипт такого типа 🤯😁😎✌️. Нажмите точку с запятой " ; ", чтобы переключить эстетический список игроков и выбрать тему по вашему выбору!
// @description:vi  Tìm bạn dễ dàng trong sploop.io! Đây là kịch bản đầu tiên của loại này 🤯😁😎✌️. Nhấn chấm phẩy " ; " để chuyển đổi danh sách người chơi thẩm mỹ và chọn chủ đề theo ý muốn!
// @description:zh  在 sploop.io 中轻松找到你的朋友!这是这种类型的第一个脚本 🤯😁😎✌️。按分号 " ; " 切换美观的玩家列表并选择您喜欢的主题!
// @author       fizzixww
// @match        https://sploop.io/
// @icon         https://i.postimg.cc/Z5WBHzhP/8-d-Sov4iq-FMua-At-VE.png
// @grant        none
// @license      All Rights Reserved
// ==/UserScript==

/*
I wish I could live in a snowy boreal forest and watch the beautiful northern lights every night....
    ` : | | | |:  ||  :     `  :  |  |+|: | : : :|   .        `              .
        ` : | :|  ||  |:  :    `  |  | :| : | : |:   |  .                    :
           .' ':  ||  |:  |  '       ` || | : | |: : |   .  `           .   :.
                  `'  ||  |  ' |   *    ` : | | :| |*|  :   :               :|
          *    *       `  |  : :  |  .      ` ' :| | :| . : :         *   :.||
               .`            | |  |  : .:|       ` | || | : |: |          | ||
        '          .         + `  |  :  .: .         '| | : :| :    .   |:| ||
           .                 .    ` *|  || :       `    | | :| | :      |:| |
   .                .          .        || |.: *          | || : :     :|||
          .            .   . *    .   .  ` |||.  +        + '| |||  .  ||`
       .             *              .     +:`|!             . ||||  :.||`
   +                      .                ..!|*          . | :`||+ |||`
       .                         +      : |||`        .| :| | | |.| ||`     .
         *     +   '               +  :|| |`     :.+. || || | |:`|| `
                              .      .||` .    ..|| | |: '` `| | |`  +
    .       +++                      ||        !|!: `       :| |
                +         .      .    | .      `|||.:      .||    .      .    `
            '                           `|.   .  `:|||   + ||'     `
    __    +      *                         `'       `'|.    `:
  "'  `---"""----....____,..^---`^``----.,.___          `.    `.  .    ____,.,-
      ___,--'""`---"'   ^  ^ ^        ^       """'---,..___ __,..---""'
  --"'                           ^                         ``--..,__
https://i.postimg.cc/kgLVhYn0/8-jo1z9twm6-Kyo-SJf.png
https://i.postimg.cc/Z5WBHzhP/8-d-Sov4iq-FMua-At-VE.png
*/

/*disclaimers:
users with the exact same name will only be written down once. this is why the player list size is smaller than the server size.
When a player leaves, their name will remain on the player list.
If you have any script ideas, dm me on discord: fizzixww
*/

(function() {
    'use strict';

    const fizzixwwsCssVariables = `
        :root {
            --bg-gradient-start: #7CCD7C;
            --bg-gradient-end: #3F7A3F;
            --border-color: #4CAF50;
            --scrollbar-color: #4CAF50;
            --text-color: #ffffff;
            --shadow-color: rgba(0, 0, 0, 0.7);
        }
    `;

    var fizzixwwsCssVariablesStyle = document.createElement('style');
    fizzixwwsCssVariablesStyle.textContent = fizzixwwsCssVariables;
    document.head.appendChild(fizzixwwsCssVariablesStyle);

    var xXplayerList = document.createElement('div');
    xXplayerList.className = 'player-list';
    document.body.appendChild(xXplayerList);

    var xXplayerNames = new Set();

    function xXaddPlayerName(name) {
        if (!xXplayerNames.has(name)) {
            var xXplayerNameElement = document.createElement('div');
            xXplayerNameElement.textContent = name;
            xXplayerNameElement.className = 'player-name';
            xXplayerNameElement.style.opacity = '0';
            xXplayerNameElement.style.animationDelay = Math.random() + 's';
            xXplayerList.appendChild(xXplayerNameElement);
            xXplayerNames.add(name);

            setTimeout(() => {
                xXplayerNameElement.style.opacity = '1';
            }, 100);

            xXdisplayJoinNotification(name);
        }
    }

    function xXdisplayJoinNotification(name) {
        var xXnotification = document.createElement('div');
        xXnotification.textContent = `${name} has joined the server!`;
        xXnotification.className = 'join-notification';
        document.body.appendChild(xXnotification);

        var existingNotifications = document.querySelectorAll('.join-notification');
        var topPosition = 20 + existingNotifications.length * 50;
        xXnotification.style.top = `${topPosition}px`;

        setTimeout(() => {
            xXnotification.style.opacity = '1';
        }, 100);

        setTimeout(() => {

            xXnotification.style.opacity = '0';

            existingNotifications.forEach((existingNotification, index) => {
                var newPosition = 20 + index * 50;
                existingNotification.style.transition = 'top 0.3s, opacity 0.5s';
                existingNotification.style.top = `${newPosition}px`;
            });

            setTimeout(() => {
                xXnotification.remove();
            }, 500);
        }, 3000);
    }

    WebSocket.prototype.fizzixwwsRealSend = WebSocket.prototype.send;
    WebSocket.prototype.send = function(data) {
        this.fizzixwwsRealSend(data);
    };

    function fizzixwwsHandleWebSocketMessages(event) {
        try {
            var fizzixwwsMessageData = JSON.parse(event.data);
            if (fizzixwwsMessageData[0] === 33) {

                xXplayerList.innerHTML = '';
                xXplayerNames.clear();

                var players = fizzixwwsMessageData[3];
                if (players.length === 0) {
                    xXaddPlayerName("Server Joined");
                } else {
                    players.forEach(function(player) {
                        var name = player[1];
                        xXaddPlayerName(name);
                    });
                }

                fizzixwwsApplyScrollbarStyling();
            } else if (fizzixwwsMessageData[0] === 32 || fizzixwwsMessageData[0] === 35) {
                var playerName = fizzixwwsMessageData[2];
                xXaddPlayerName(playerName);
            }
        } catch (error) {
            console.error('Error parsing WebSocket message:', error);
        }
    }

    var fizzixwwsWsProto = WebSocket.prototype;
    var fizzixwwsOrigSend = fizzixwwsWsProto.send;
    var fizzixwwsOrigAddEventListener = fizzixwwsWsProto.addEventListener;

    fizzixwwsWsProto.send = function(data) {
        fizzixwwsOrigSend.apply(this, arguments);
        fizzixwwsOrigAddEventListener.call(this, 'message', fizzixwwsHandleWebSocketMessages);
    };

    setInterval(() => {
        xXplayerList.scrollTop += 1;
    }, 50);

    function fizzixwwsSetPinkTheme() {
        document.documentElement.style.setProperty('--bg-gradient-start', '#FFC6D9');
        document.documentElement.style.setProperty('--bg-gradient-end', '#FF9494');
        document.documentElement.style.setProperty('--border-color', '#FF69B4');
        document.documentElement.style.setProperty('--scrollbar-color', '#FF69B4');
        document.documentElement.style.setProperty('--text-color', '#ffe6fb');
        document.documentElement.style.setProperty('--shadow-color', 'rgba(0, 0, 0, 0.7)');
    }

    function fizzixwwsSetLightOrangeTheme() {
        document.documentElement.style.setProperty('--bg-gradient-start', '#FFD699');
        document.documentElement.style.setProperty('--bg-gradient-end', '#FFB74D');
        document.documentElement.style.setProperty('--border-color', '#FF9800');
        document.documentElement.style.setProperty('--scrollbar-color', '#FF9800');
        document.documentElement.style.setProperty('--text-color', '#fff1c7');
        document.documentElement.style.setProperty('--shadow-color', 'rgba(0, 0, 0, 0.7)');
    }

    function fizzixwwsSetSkyeBlueTheme() {
        document.documentElement.style.setProperty('--bg-gradient-start', '#A6DAFF');
        document.documentElement.style.setProperty('--bg-gradient-end', '#77BDFE');
        document.documentElement.style.setProperty('--border-color', '#4FC3F7');
        document.documentElement.style.setProperty('--scrollbar-color', '#4FC3F7');
        document.documentElement.style.setProperty('--text-color', '#cffdff');
        document.documentElement.style.setProperty('--shadow-color', 'rgba(0, 0, 0, 0.7)');
    }

    function fizzixwwsSetGreenTheme() {
        document.documentElement.style.setProperty('--bg-gradient-start', '#7CCD7C');
        document.documentElement.style.setProperty('--bg-gradient-end', '#3F7A3F');
        document.documentElement.style.setProperty('--border-color', '#4CAF50');
        document.documentElement.style.setProperty('--scrollbar-color', '#4CAF50');
        document.documentElement.style.setProperty('--text-color', '#ddffdb');
        document.documentElement.style.setProperty('--shadow-color', 'rgba(0, 0, 0, 0.7)');
    }

    var fizzixwwsThemeButtonsContainer = document.createElement('div');
    fizzixwwsThemeButtonsContainer.className = 'theme-buttons-container';
    var pinkButton = fizzixwwsCreateThemeButton('pink-button', fizzixwwsSetPinkTheme);
    var lightOrangeButton = fizzixwwsCreateThemeButton('light-orange-button', fizzixwwsSetLightOrangeTheme);
    var skyeBlueButton = fizzixwwsCreateThemeButton('skye-blue-button', fizzixwwsSetSkyeBlueTheme);
    var greenButton = fizzixwwsCreateThemeButton('green-button', fizzixwwsSetGreenTheme);

    fizzixwwsThemeButtonsContainer.appendChild(pinkButton);
    fizzixwwsThemeButtonsContainer.appendChild(lightOrangeButton);
    fizzixwwsThemeButtonsContainer.appendChild(skyeBlueButton);
    fizzixwwsThemeButtonsContainer.appendChild(greenButton);
    document.body.appendChild(fizzixwwsThemeButtonsContainer);

    function fizzixwwsCreateThemeButton(className, onClick) {
        var button = document.createElement('div');
        button.className = 'theme-button ' + className;
        button.onclick = onClick;
        return button;
    }
    var fizzixwwsTextElement = document.createElement('span');
    var fizzixwwsData = atob('YnkgZml6eml4d3c=');
    fizzixwwsTextElement.textContent = fizzixwwsData;
    fizzixwwsTextElement.style.position = 'absolute';
    fizzixwwsTextElement.style.top = '0';
    fizzixwwsTextElement.style.left = '80px';
    fizzixwwsTextElement.style.zIndex = '9999';
    fizzixwwsTextElement.style.color = 'rgba(0, 0, 0, 0.07)';
    document.body.appendChild(fizzixwwsTextElement);
    var fizzixwwsDisplayToggled = false;
    document.addEventListener('keydown', function(event) {
        if (event.key === ';') {
            if (fizzixwwsDisplayToggled) {
                xXplayerList.style.display = 'block';
                fizzixwwsThemeButtonsContainer.style.display = 'flex';
            } else {
                xXplayerList.style.display = 'none';
                fizzixwwsThemeButtonsContainer.style.display = 'none';
            }
            fizzixwwsDisplayToggled = !fizzixwwsDisplayToggled;
        }
    });

    // Function to apply scrollbar styling only when needed
    function fizzixwwsApplyScrollbarStyling() {
        if (xXplayerList.scrollHeight > xXplayerList.clientHeight) {
            var style = document.createElement('style');
            style.textContent = `
                .player-list::-webkit-scrollbar {
                    width: 10px;
                }

                .player-list::-webkit-scrollbar-thumb {
                    background-color: var(--scrollbar-color);
                    border-radius: 5px;
                }
            `;
            document.head.appendChild(style);
        }
    }

    var fizzixwwsStyle = document.createElement('style');
    fizzixwwsStyle.textContent = `
        .player-list {
            font-family: 'Arial', sans-serif;
            position: fixed;
            top: 10%;
            left: 10%;
            padding: 20px;
            background: linear-gradient(to bottom right, var(--bg-gradient-start), var(--bg-gradient-end));
            border: 12px solid var(--border-color);
            border-radius: 20px;
            overflow: auto;
            max-height: 80%;
            scrollbar-width: thin;
            scrollbar-color: var(--scrollbar-color) transparent;
            animation: sway 10s ease-in-out infinite;
            box-shadow: 0 0 20px var(--shadow-color);
        }

        .player-name {
            margin-bottom: 10px;
            color: var(--text-color);
            font-size: 18px;
            text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
            animation: fadeIn 1.5s ease-out forwards, idle 5s infinite ease-in-out, pulse 2s infinite ease-in-out;
        }

        @keyframes sway {
            0% {
                transform: rotate(-1deg);
            }
            50% {
                transform: rotate(1deg);
            }
            100% {
                transform: rotate(-1deg);
            }
        }

        @keyframes fadeIn {
            from {
                opacity: 0;
                transform: translateY(10px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        @keyframes idle {
            0% {
                transform: translateY(0);
            }
            50% {
                transform: translateY(-2px);
            }
            100% {
                transform: translateY(0);
            }
        }

        @keyframes pulse {
            0% {
                transform: scale(1);
            }
            50% {
                transform: scale(1.05);
            }
            100% {
                transform: scale(1);
            }
        }

        .theme-buttons-container {
            position: fixed;
            top: 10%;
            left: 5%;
            display: flex;
            flex-direction: column;
            gap: 10px;
        }

        .theme-button {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            cursor: pointer;
            border: none;
            background-image: linear-gradient(to bottom right, var(--bg-gradient-start), var(--bg-gradient-end));
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);
            transition: transform 0.3s, box-shadow 0.3s;
        }

        .theme-button:hover {
            transform: translateY(-2px);
            box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15), 0 2px 4px rgba(0, 0, 0, 0.1);
        }

        .pink-button { background-image: linear-gradient(to bottom right, #FFC6D9, #FF9494); }
        .light-orange-button { background-image: linear-gradient(to bottom right, #FFD699, #FFB74D); }
        .skye-blue-button { background-image: linear-gradient(to bottom right, #A6DAFF, #77BDFE); }
        .green-button { background-image: linear-gradient(to bottom right, #7CCD7C, #3F7A3F); }

        .join-notification {
            position: fixed;
            left: 50%;
            transform: translateX(-50%);
            background-color: rgba(0, 0, 0, 0.3);
            color: #ffffff;
            padding: 8px 16px;
            border-radius: 8px;
            font-size: 14px;
            opacity: 0;
            transition: opacity 0.5s, top 0.3s;
        }
    `;
    document.head.appendChild(fizzixwwsStyle);
})();


//some code by cactus that makes homepage look nice
const idsToDelete = ['game-bottom-content', 'da-left', 'da-right', 'game-left-content-main', "game-right-content-main", "discord", 'alsoTryLink', 'cross-promo'];
idsToDelete.forEach(id => {
    const elementToRemove = document.getElementById(id);
    if (elementToRemove) {
        elementToRemove.parentNode.removeChild(elementToRemove);
    } else {
        console.error(`Element with ID ${id} not found!`);
    }
});
const container = document.getElementById('game-content');
const elementToRealign = document.getElementById('game-middle-main');
const leftOffset = (container.offsetWidth - elementToRealign.offsetWidth) / 2;
elementToRealign.style.left = leftOffset + 'px';

function blur() {
    const homepage = document.getElementById("homepage");
    homepage.style.display = "flex";
    const blurValue = 1.5;
    homepage.style.backdropFilter = `blur(${blurValue}px)`;
}
setTimeout(blur, 2000);

(function() {
    'use strict';

    const styleElement = document.head.appendChild(document.createElement('style'));
    styleElement.type = 'text/css';
    styleElement.appendChild(document.createTextNode(`#cross-promo, #bottom-wrap, #google_play, #game-left-content-main, #game-bottom-content, #game-right-content-main, #right-content { display: none !important; }`));


    const mainContent = document.querySelector('#main-content');
    mainContent.style.width = '100%';

    const popUi = document.getElementById('pop-ui');
    popUi.style.opacity = '0.7';

    const rankingMiddleMain = document.getElementById('ranking-middle-main');
    rankingMiddleMain.style.height = '380px';

    const rankingRanksContainer = document.getElementById('ranking-ranks-container');
    rankingRanksContainer.style.height = '295px';

    const ranking2MiddleMain = document.getElementById('ranking2-middle-main');
    ranking2MiddleMain.style.height = '380px';

    const rankingRankContainer = document.getElementById('ranking-rank-container');
    rankingRankContainer.style.height = '295px';

    const profileLeftMain = document.getElementById('profile-left-main');
    profileLeftMain.style.width = '650px';

    const changeUsername = document.getElementById('change-username');
    changeUsername.style.width = '200px';

    const popBoxes = document.querySelectorAll('.pop-box');
    popBoxes.forEach((box) => {
        box.style.boxShadow = "inset 0 4px 0 #4e564500, inset 0 -4px 0 #38482500, 0px 2px 0 5px rgb(20 20 20 / 0%), 0px 0px 0 15px rgb(20 20 20 / 0%)";
    });
})();


// hi =)) thanks to bear for teaching me about websockets