Death Counter

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

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==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();