Death Counter

Count how many Deaths you got and log deaths by area. Disables the 'B' key for leaderboard deletion.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name            Death Counter
// @name:ru         Счётчик Смертей
// @namespace       http://tampermonkey.net/
// @version         1.3
// @description     Count how many Deaths you got and log deaths by area. Disables the 'B' key for leaderboard deletion.
// @description:ru  Посчитай, сколько у тебя смертей, и это отключит клавишу B.
// @author          ArhaanJinnah
// @match           https://evades.io/*
// @icon            none
// @grant           none
// ==/UserScript==

// Objects to track deaths
const playerDeathData = {}; // { playerName: { map: { area: deathCount } } }
const watchedPlayers = new Set(); // Set of players to track
const downedPlayers = new Set(); // Set of currently downed players

// Death counter UI container
const counterContainer = document.createElement('div');
counterContainer.style.position = 'fixed';
counterContainer.style.bottom = '10px';
counterContainer.style.right = '10px';
counterContainer.style.backgroundColor = '#333';
counterContainer.style.color = '#fff';
counterContainer.style.padding = '10px';
counterContainer.style.borderRadius = '5px';
counterContainer.style.display = 'none';
counterContainer.style.display = 'flex';
counterContainer.style.flexDirection = 'column';
counterContainer.style.alignItems = 'flex-start';
document.body.appendChild(counterContainer);

// Reset button
const resetButton = document.createElement('button');
resetButton.innerText = 'Reset';
resetButton.style.padding = '5px';
resetButton.style.cursor = 'pointer';
resetButton.style.backgroundColor = '#ff5c5c';
resetButton.style.color = '#fff';
resetButton.style.border = 'none';
resetButton.style.borderRadius = '5px';
resetButton.addEventListener('click', () => {
    watchedPlayers.forEach(playerName => {
        playerDeathData[playerName] = {};
    });
    updateDeathCounters();
});

// Create the Toggle Size Button
const toggleSizeButton = document.createElement('button');
toggleSizeButton.innerText = 'Toggle';
toggleSizeButton.style.padding = '5px';
toggleSizeButton.style.cursor = 'pointer';
toggleSizeButton.style.backgroundColor = '#4CAF50';
toggleSizeButton.style.color = '#fff';
toggleSizeButton.style.border = 'none';
toggleSizeButton.style.borderRadius = '5px';

let isSmall = false;
toggleSizeButton.addEventListener('click', () => {
    if (isSmall) {
        counterContainer.style.width = 'auto';
        counterContainer.style.height = 'auto';
        counterContainer.style.padding = '10px';
        resetButton.style.display = 'block';
    } else {
        counterContainer.style.width = '5px';
        counterContainer.style.height = '5px';
        counterContainer.style.padding = '5px';
        resetButton.style.display = 'none';
    }
    isSmall = !isSmall;
});

// Button container
const buttonContainer = document.createElement('div');
buttonContainer.style.display = 'flex';
buttonContainer.style.alignItems = 'center';
buttonContainer.appendChild(resetButton);
buttonContainer.appendChild(toggleSizeButton);

counterContainer.appendChild(buttonContainer);

// Update death counters UI
function updateDeathCounters() {
    counterContainer.innerHTML = '';
    counterContainer.appendChild(buttonContainer);

    if (watchedPlayers.size > 0) {
        counterContainer.style.display = 'block';
        watchedPlayers.forEach(playerName => {
            const playerData = playerDeathData[playerName] || {};
            const mapDeaths = Object.keys(playerData).reduce((total, map) => {
                const mapData = playerData[map];
                return total + Object.values(mapData).reduce((sum, deaths) => sum + deaths, 0);
            }, 0);

            const playerDiv = document.createElement('div');
            playerDiv.innerText = `${playerName}: ${mapDeaths} deaths`;
            playerDiv.style.marginBottom = '5px';
            playerDiv.style.cursor = 'pointer';

            // Left-click to show Death Log
            playerDiv.addEventListener('click', () => showDeathLog(playerName));

            // Right-click context menu for removing player
            playerDiv.addEventListener('contextmenu', (event) => {
                event.preventDefault(); // Prevent the default right-click menu
                
                // Create custom context menu
                const contextMenu = document.createElement('div');
                contextMenu.style.position = 'absolute';
                contextMenu.style.top = `${event.clientY}px`;
                contextMenu.style.left = `${event.clientX}px`;
                contextMenu.style.backgroundColor = '#333';
                contextMenu.style.color = '#fff';
                contextMenu.style.padding = '10px';
                contextMenu.style.borderRadius = '5px';
                contextMenu.style.boxShadow = '0 4px 10px rgba(0, 0, 0, 0.5)';
                contextMenu.style.zIndex = '1000';

                // Add "Remove" option to context menu
                const removeOption = document.createElement('div');
                removeOption.innerText = 'Remove';
                removeOption.style.cursor = 'pointer';
                removeOption.style.padding = '5px';
                removeOption.style.borderBottom = '1px solid #fff';
                removeOption.addEventListener('click', () => {
                    watchedPlayers.delete(playerName);
                    updateDeathCounters();
                    document.body.removeChild(contextMenu); // Close the context menu
                });

                contextMenu.appendChild(removeOption);
                document.body.appendChild(contextMenu);

                // Close the menu if clicking outside
                document.addEventListener('click', () => {
                    document.body.removeChild(contextMenu);
                }, { once: true });
            });

            counterContainer.appendChild(playerDiv);
        });
    } else {
        counterContainer.style.display = 'none';
    }
}

// Show detailed Death Log
function showDeathLog(playerName) {
    const log = playerDeathData[playerName] || {};
    const logContainer = document.createElement('div');
    logContainer.style.position = 'fixed';
    logContainer.style.top = '50%';
    logContainer.style.left = '50%';
    logContainer.style.transform = 'translate(-50%, -50%)';
    logContainer.style.backgroundColor = '#333';
    logContainer.style.color = '#fff';
    logContainer.style.padding = '20px';
    logContainer.style.borderRadius = '10px';
    logContainer.style.zIndex = '1000';
    logContainer.style.whiteSpace = 'pre-wrap';
    logContainer.style.textAlign = 'left';
    logContainer.style.maxHeight = '70%';
    logContainer.style.overflowY = 'auto';
    logContainer.style.boxShadow = '0 4px 10px rgba(0, 0, 0, 0.5)';

    // Title
    const title = document.createElement('h2');
    title.innerText = `Death Log for ${playerName}`;
    title.style.marginBottom = '10px';
    logContainer.appendChild(title);

    // Map and area breakdown
    Object.entries(log).forEach(([map, areas]) => {
        const mapEntry = document.createElement('div');
        mapEntry.style.marginBottom = '5px';
        mapEntry.style.cursor = 'pointer';
        mapEntry.style.fontWeight = 'bold';
        mapEntry.innerText = `${map}: ${Object.values(areas).reduce((sum, deaths) => sum + deaths, 0)} deaths`;

        const areaContainer = document.createElement('div');
        areaContainer.style.marginTop = '5px';
        areaContainer.style.paddingLeft = '10px';
        areaContainer.style.display = 'none'; // Hidden by default

        Object.entries(areas).forEach(([area, deaths]) => {
            const areaEntry = document.createElement('div');
            areaEntry.style.marginBottom = '3px';
            areaEntry.innerText = `- ${area}: ${deaths} deaths`;
            areaContainer.appendChild(areaEntry);
        });

        // Toggle area breakdown on click
        mapEntry.addEventListener('click', () => {
            areaContainer.style.display = areaContainer.style.display === 'none' ? 'block' : 'none';
        });

        logContainer.appendChild(mapEntry);
        logContainer.appendChild(areaContainer);
    });

    // Close button
    const closeButton = document.createElement('button');
    closeButton.innerText = 'Close';
    closeButton.style.marginTop = '10px';
    closeButton.style.padding = '5px 10px';
    closeButton.style.cursor = 'pointer';
    closeButton.style.backgroundColor = '#ff5c5c';
    closeButton.style.color = '#fff';
    closeButton.style.border = 'none';
    closeButton.style.borderRadius = '5px';
    closeButton.addEventListener('click', () => {
        document.body.removeChild(logContainer);
    });

    logContainer.appendChild(closeButton);
    document.body.appendChild(logContainer);
}

// Check leaderboard for downed players
function checkLeaderboard() {
    const leaderboardLines = document.querySelectorAll('#leaderboard .leaderboard-line');
    const currentDownedPlayers = new Set();

    leaderboardLines.forEach(line => {
        const title = line.getAttribute('title');
        const playerName = title.split(' [')[0];
        const map = line.classList[1].replace(/-/g, ' ');
        const area = title.match(/\[(.*?)\]/)?.[1] || 'Unknown Area';

        if (playerName) {
            if (!line.querySelector('.track-button')) {
                const trackButton = document.createElement('button');
                trackButton.innerText = 'Track';
                trackButton.classList.add('track-button');
                trackButton.style.marginLeft = '10px';
                trackButton.style.padding = '3px 8px';
                trackButton.style.cursor = 'pointer';
                trackButton.style.backgroundColor = '#4CAF50';
                trackButton.style.color = '#fff';
                trackButton.style.border = 'none';
                trackButton.style.borderRadius = '5px';

                trackButton.addEventListener('click', () => {
                    if (!watchedPlayers.has(playerName)) {
                        watchedPlayers.add(playerName);
                        trackButton.innerText = 'Untrack';
                        trackButton.style.backgroundColor = '#ff5c5c';
                    } else {
                        watchedPlayers.delete(playerName);
                        trackButton.innerText = 'Track';
                        trackButton.style.backgroundColor = '#4CAF50';
                    }
                    updateDeathCounters();
                });

                const playerNameElement = line.querySelector('.leaderboard-name');
                if (playerNameElement) {
                    playerNameElement.appendChild(trackButton);
                }
            }
        }

        if (line.classList.contains('leaderboard-downed')) {
            if (playerName && watchedPlayers.has(playerName)) {
                if (!downedPlayers.has(playerName)) {
                    if (!playerDeathData[playerName]) playerDeathData[playerName] = {};
                    if (!playerDeathData[playerName][map]) playerDeathData[playerName][map] = {};
                    playerDeathData[playerName][map][area] = (playerDeathData[playerName][map][area] || 0) + 1;

                    updateDeathCounters();
                }
                currentDownedPlayers.add(playerName);
            }
        }
    });

    downedPlayers.clear();
    currentDownedPlayers.forEach(player => downedPlayers.add(player));
}

// Disable 'B' key for leaderboard deletion
document.addEventListener('keydown', event => {
    if (event.key.toLowerCase() === 'b') {
        event.stopPropagation();
        event.preventDefault();
    }
});

// Toggle leaderboard visibility
const leaderboard = document.getElementById('leaderboard');
leaderboard.style.visibility = 'hidden';

const toggleLeaderboardButton = document.createElement('button');
toggleLeaderboardButton.textContent = 'Toggle Leaderboard';
toggleLeaderboardButton.style.position = 'absolute';
toggleLeaderboardButton.style.left = '10px';
toggleLeaderboardButton.style.top = '50px';
toggleLeaderboardButton.style.zIndex = '1000';

let isLeaderboardVisible = false;

function updateButtonColor() {
    toggleLeaderboardButton.style.backgroundColor = isLeaderboardVisible ? 'green' : 'red';
}

updateButtonColor();

toggleLeaderboardButton.addEventListener('click', () => {
    isLeaderboardVisible = !isLeaderboardVisible;
    leaderboard.style.visibility = isLeaderboardVisible ? 'visible' : 'hidden';
    updateButtonColor();
});

const leaderboardObserver = new MutationObserver(() => {
    if (!isLeaderboardVisible) leaderboard.style.visibility = 'hidden';
});

leaderboardObserver.observe(leaderboard, { attributes: true, childList: true, subtree: true });

document.body.appendChild(toggleLeaderboardButton);

// Check leaderboard periodically
setInterval(checkLeaderboard, 100);

// Initialize with some watched players
watchedPlayers.add('ArhaanJinnah');
updateDeathCounters();