Extra Player Details

Designed to provide extra information about players

// ==UserScript==
// @name        Extra Player Details
// @namespace   https://github.com/kamarov-therussiantank
// @author       kamarov
// @description Designed to provide extra information about players
// @version     1.0.3
// @license     GPL-3.0
// @match      https://tanktrouble.com/*
// @run-at      document-end
// @grant       GM_addStyle
// @require     https://update.gf.qytechs.cn/scripts/482092/1309109/TankTrouble%20Development%20Library.js
// @noframes
// ==/UserScript==

GM_addStyle(`
.exp.tooltipstered {
    position: relative;
    height: 30px;
}
#tankinfo .rank, #tankinfo .xp {
    position: relative;
    height: 30px;
}
.exp-bar {
    background-image: image-set(url(https://i.imgur.com/R2CiGV4.png) 1x, url(https://i.imgur.com/6BC4tAu.png) 2x);
    background-size: 10px 22px;
    height: 100%;
}
.about-container {
    position: relative;
    z-index: 2;
    font-size: 12px;
}
.bannedText-container {
    position: relative;
    z-index: 2;
    font-size: 12px;
    margin: 20px 0 20px 0;
}
span.exp-text {
    position: absolute;
    top: 3px;
    left: 32%;
    font-family: 'Arial';
    font-size: 14px;
    font-weight: bold;
    color: #fff;
    text-shadow: -1.4px -1.4px 0 black, 1.4px -1.4px 0 black, -1.4px 1.4px 0 black, 1.4px 1.4px 0 black;
}
#tankinfo .username {
    z-index: 2;
}
.adminBadge {
    z-index: 1;
    position: absolute;
    top: -65px;
    right: -22px;
}
.banned-Icon {
    z-index: 1;
    position: absolute;
    top: -130px;
    left: 10px;
}
tr.tooltipstered {
    display: none !important;
}
.statsContainer img.statsIcon {
    position: absolute;
}
.statsContainer svg {
    left: 45px;
}
.deaths.tooltipstered {
    left: 55px;
}
#tankinfo table td:first-child .statsIcon {
    left: 3px;
}
#tankinfo table td:first-child svg {
    left: 44px;
}
#tankinfo table td:last-child .statsIcon {
    right: 5px;
}
#tankinfo table td:last-child svg {
    left: 5px;
}
`);

(() => {
	Loader.interceptFunction(TankTrouble.TankInfoBox, '_initialize', (original, ...args) => {
		original(...args);

		// Initialize badges Div
		TankTrouble.TankInfoBox.infoBadgesDiv = $('<div class="badge-container"/>');

		// Define icons for badges
		TankTrouble.TankInfoBox.infoBadgesIcon1 = $('<img class="badgeIcon" src="https://i.imgur.com/EM9M66p.png"/>'); // Premium
		TankTrouble.TankInfoBox.infoBadgesIcon2 = $('<img class="badgeIcon" src="https://i.imgur.com/FTvsqiv.png"/>'); // Kickstarter
		TankTrouble.TankInfoBox.infoBadgesIcon3 = $('<img class="badgeIcon" src="https://i.imgur.com/PfnLu7l.png"/>'); // Admin
		TankTrouble.TankInfoBox.infoBadgesIcon4 = $('<img class="badgeIcon" src="https://i.imgur.com/1UQeWVB.png"/>'); // Beta Tester
		TankTrouble.TankInfoBox.infoBadgesIcon5 = $('<img class="badgeIcon" src="https://i.imgur.com/9WCCK6U.png"/>'); // Classic Player
		TankTrouble.TankInfoBox.infoBannedIcon = $('<img class="banned-Icon" src="https://i.imgur.com/AlA3MSg.png"/>'); // Banned Player

		// Create badges
		TankTrouble.TankInfoBox.classicPlayerBadge = $('<div class="classicBadge"/>');
		TankTrouble.TankInfoBox.classicPlayerBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon5);
		TankTrouble.TankInfoBox.classicPlayerBadge.append(TankTrouble.TankInfoBox.classicPlayerText);
		TankTrouble.TankInfoBox.betaTesterBadge = $('<div class="betaTesterBadge"/>');
		TankTrouble.TankInfoBox.betaTesterBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon4);
		TankTrouble.TankInfoBox.premiumBadge = $('<div class="premiumMemberBadge"/>');
		TankTrouble.TankInfoBox.premiumBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon1);
		TankTrouble.TankInfoBox.kickstarterBadge = $('<div class="kickstarterBadge"/>');
		TankTrouble.TankInfoBox.kickstarterBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon2);
		TankTrouble.TankInfoBox.adminBadge = $('<div class="adminBadge"/>');
		TankTrouble.TankInfoBox.adminBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon3);
		TankTrouble.TankInfoBox.bannedIcon = $('<div class="bannedIcon"/>');
		TankTrouble.TankInfoBox.bannedIcon.append(TankTrouble.TankInfoBox.infoBannedIcon);

    // Experience progress bar
		TankTrouble.TankInfoBox.infoExpDiv = $('<div class="exp tooltipstered"/>');
		TankTrouble.TankInfoBox.infoExpTextDiv = $('<div class="progress"/>');
		TankTrouble.TankInfoBox.infoExpBorder = $('<div class="border"/>');
		TankTrouble.TankInfoBox.infoExpBar = $('<div class="exp-bar"/>');
		TankTrouble.TankInfoBox.infoExpText = $('<span class="exp-text"/>');
		TankTrouble.TankInfoBox.infoExpTextDiv.append(TankTrouble.TankInfoBox.infoExpBorder);
		TankTrouble.TankInfoBox.infoExpTextDiv.append(TankTrouble.TankInfoBox.infoExpBar);
		TankTrouble.TankInfoBox.infoExpTextDiv.append(TankTrouble.TankInfoBox.infoExpText);
		TankTrouble.TankInfoBox.infoExpDiv.append(TankTrouble.TankInfoBox.infoExpTextDiv);
		TankTrouble.TankInfoBox.infoExpDiv.insertAfter(TankTrouble.TankInfoBox.infoRank);

    // Player additional information element
		TankTrouble.TankInfoBox.infoAboutDiv = $('<div class="tooltipstered"/>');
		TankTrouble.TankInfoBox.infoAboutTextDiv = $('<div class="about-container"/>');
		TankTrouble.TankInfoBox.infoAboutText = $('<span class="about-text"/>');
		TankTrouble.TankInfoBox.infoAboutTextDiv.append(TankTrouble.TankInfoBox.infoAboutText);
		TankTrouble.TankInfoBox.infoAboutDiv.append(TankTrouble.TankInfoBox.infoAboutTextDiv);
		TankTrouble.TankInfoBox.infoAboutDiv.insertAfter(TankTrouble.TankInfoBox.infoName);

    // Banned information element
		TankTrouble.TankInfoBox.infoBannedPlayerDiv = $('<div class="tooltipstered"/>');
		TankTrouble.TankInfoBox.infoBannedPlayerTextDiv = $('<div class="bannedText-container"/>');
		TankTrouble.TankInfoBox.infoBannedPlayerText = $('<span class="bannedText-text"/>');
		TankTrouble.TankInfoBox.infoBannedPlayerTextDiv.append(TankTrouble.TankInfoBox.infoBannedPlayerText);
		TankTrouble.TankInfoBox.infoBannedPlayerDiv.append(TankTrouble.TankInfoBox.infoBannedPlayerTextDiv);
		TankTrouble.TankInfoBox.infoBannedPlayerDiv.insertAfter(TankTrouble.TankInfoBox.infoRank);

    // Create a container for the icon and text
    TankTrouble.TankInfoBox.infoDeathsDiv = $('<td class="deaths tooltipstered"/>');
    TankTrouble.TankInfoBox.infoDeaths = $(`
    <div class="statsContainer">
        <img class="statsIcon" src="https://i.imgur.com/ze2jYnc.png" srcset="https://i.imgur.com/XIQFQn6.png 2x"/>
        <div class="hasSVG">
            <svg version="1.1" width="58" height="34">
                <text id="deathsTextOutline" x="1" y="22" text-anchor="start" font-family="Arial Black" font-size="14" fill="none" stroke="black" stroke-linejoin="round" stroke-width="3" letter-spacing="1">N/A</text>
                <text id="deathsText" x="1" y="22" text-anchor="start" font-family="Arial Black" font-size="14" fill="white" letter-spacing="1">N/A</text>
            </svg>
        </div>
    </div>
    `);
    TankTrouble.TankInfoBox.infoDeathsDiv.append(TankTrouble.TankInfoBox.infoDeaths);

    TankTrouble.TankInfoBox.infoDeathsDiv.tooltipster({
    content: 'Deaths',
    position: 'left',
    offsetX: 5
    });

    TankTrouble.TankInfoBox.infoDeathsDiv.insertAfter(TankTrouble.TankInfoBox.infoKillsAndVictoriesTableRow);

		// Style badges Div
		TankTrouble.TankInfoBox.infoBadgesDiv.css({
			display: 'flex',
			'align-items': 'center',
			'justify-content': 'center',
			'flex-wrap': 'wrap',
			margin: '0px auto',
			width: 'fit-content'
		});

		// Icon Styling
		// Scale the icons
		TankTrouble.TankInfoBox.infoBadgesIcon1.css({
			width: '38px',
			margin: '0'
		});

    TankTrouble.TankInfoBox.infoBadgesIcon2.css({
			width: '38px',
			margin: '0'
		});

    TankTrouble.TankInfoBox.infoBadgesIcon3.css({
			width: '102px',
			margin: '0'
		});

    TankTrouble.TankInfoBox.infoBadgesIcon4.css({
			width: '38px',
			margin: '0'
		});

    TankTrouble.TankInfoBox.infoBadgesIcon5.css({
			width: '38px',
			margin: '0'
		});

    TankTrouble.TankInfoBox.infoBannedIcon.css({
			width: '200px',
			margin: '0',
		});

    TankTrouble.TankInfoBox.classicPlayerBadge.tooltipster({
			position: 'top',
			offsetX: 0
		});

    TankTrouble.TankInfoBox.betaTesterBadge.tooltipster({
			position: 'top',
			offsetX: 0
		});

    TankTrouble.TankInfoBox.premiumBadge.tooltipster({
			position: 'top',
			offsetX: 0
		});

    TankTrouble.TankInfoBox.kickstarterBadge.tooltipster({
			position: 'top',
			offsetX: 0
		});

		TankTrouble.TankInfoBox.infoExpDiv.tooltipster({
			position: 'right',
			offsetX: 5
		});

		// Append all elements
		TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.classicPlayerBadge);
		TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.betaTesterBadge);
		TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.premiumBadge);
		TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.kickstarterBadge);
		TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.adminBadge);
		TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.bannedIcon);
		TankTrouble.TankInfoBox.infoBadgesDiv.insertBefore(TankTrouble.TankInfoBox.infoRank);

		// Hide badges by default
		TankTrouble.TankInfoBox.infoExpDiv.hide();
		TankTrouble.TankInfoBox.infoBadgesDiv.hide();
		TankTrouble.TankInfoBox.classicPlayerBadge.hide();
		TankTrouble.TankInfoBox.betaTesterBadge.hide();
		TankTrouble.TankInfoBox.premiumBadge.hide();
		TankTrouble.TankInfoBox.kickstarterBadge.hide();
		TankTrouble.TankInfoBox.adminBadge.hide();
	});

  // Display
    Loader.interceptFunction(TankTrouble.TankInfoBox, 'show', (original, ...args) => {
        original(...args);

        TankTrouble.TankInfoBox.classicPlayerBadge.tooltipster('content', 'Classic Player');
        TankTrouble.TankInfoBox.betaTesterBadge.tooltipster('content', 'Beta Tester');
        TankTrouble.TankInfoBox.premiumBadge.tooltipster('content', 'Premium Member');
        TankTrouble.TankInfoBox.kickstarterBadge.tooltipster('content', 'Kickstarter Backer');
        TankTrouble.TankInfoBox.infoExpDiv.tooltipster('content', 'Classic EXP');

        const [,, playerId] = args;

        Backend.getInstance().getPlayerDetails(result => {
            if (typeof result === 'object') {
                const playerId = result.getPlayerId();
                const username = result.getUsername();
                const banned = result.getBanned();
                const classicPlayer = result.getExperience();
                const premiumMember = result.getPremium();
                const betaTester = result.getBeta();
                const adminMember = result.getGmLevel();
                const deaths = result.getDeaths();
                const lastLogin = result.getLastLogin();

                $("#deathsTextOutline").text(deaths);
                $("#deathsText").text(deaths);

                if (deaths > 100000) {
                    $("#deathsTextOutline").attr("font-size", "12"); // Increase font size
                    $("#deathsText").attr("font-size", "12"); // Increase font size
                } else {
                    $("#deathsTextOutline").attr("font-size", "14"); // Default size
                    $("#deathsText").attr("font-size", "14"); // Default size
                }

                // Always show the badges div
                TankTrouble.TankInfoBox.infoBadgesDiv.show();

                // Kickstarter Badge
                Backend.getInstance().ajax.getBackers(backerResult => {
                    const backers = backerResult.result.data;

                    if (backers.includes(username)) {
                        TankTrouble.TankInfoBox.kickstarterBadge.show();
                    } else {
                        TankTrouble.TankInfoBox.kickstarterBadge.hide();
                    }
                });

                // Classic Player badge & Experience progress bar
                if (classicPlayer) {
                    TankTrouble.TankInfoBox.infoExpDiv.show();
                    TankTrouble.TankInfoBox.classicPlayerBadge.show();
                    TankTrouble.TankInfoBox.infoExpText.text(`EXP: ${classicPlayer}`);

                    // Adjust EXP text position based on value
                    const expTextElement = TankTrouble.TankInfoBox.infoExpText[0];

                    if (classicPlayer <= 9999999) {
                        expTextElement.style.left = '27%';
                    }

                    if (classicPlayer <= 999999) {
                        expTextElement.style.left = '29%';
                    }

                    if (classicPlayer <= 99999) {
                        expTextElement.style.left = '32%';
                    }

                    if (classicPlayer <= 9999) {
                        expTextElement.style.left = '34%';
                    }

                    if (classicPlayer <= 999) {
                        expTextElement.style.left = '35%';
                    }

                    if (classicPlayer <= 99) {
                        expTextElement.style.left = '37%';
                    }

                } else {
                    TankTrouble.TankInfoBox.infoExpDiv.hide();
                    TankTrouble.TankInfoBox.classicPlayerBadge.hide();
                }

                // Display player info or banned message
                if (banned) {
                    TankTrouble.TankInfoBox.bannedIcon.show();
                    TankTrouble.TankInfoBox.infoAboutDiv.show();
                    TankTrouble.TankInfoBox.infoAboutText.text(`#${playerId}`);
                    TankTrouble.TankInfoBox.infoBannedPlayerDiv.show();
                    TankTrouble.TankInfoBox.infoBannedPlayerText.text(`Player has been permanently banned because of rules violation. Player statistics are counted towards the scrapyard.`);
                    document.querySelector(".about-container").style.color = "#fff";
                    document.querySelector("#tankinfo .rank").style.display = "none";
                    document.querySelector("#tankinfo .xp").style.display = "none";
                    document.querySelector(".exp.tooltipstered").style.display = "none";
                    document.querySelector("#tankinfo table").style.display = "none";
                    document.querySelector(".actions.centered").style.display = "none";
                } else if (playerId) {
                    TankTrouble.TankInfoBox.bannedIcon.hide();
                    TankTrouble.TankInfoBox.infoBannedPlayerDiv.hide();
                    TankTrouble.TankInfoBox.infoAboutDiv.show();
                    TankTrouble.TankInfoBox.infoAboutText.text(`#${playerId}`);
                    document.querySelector(".about-container").style.color = "";
                    document.querySelector("#tankinfo .rank").style.display = "";
                    document.querySelector("#tankinfo .xp").style.display = "";
                    document.querySelector("#tankinfo table").style.display = "";
                    document.querySelector(".actions.centered").style.display = "";
                } else {
                    TankTrouble.TankInfoBox.infoAboutDiv.hide();
                    document.querySelector(".exp.tooltipstered").style.display = "";
                }

                // Show or hide other badges
                premiumMember ? TankTrouble.TankInfoBox.premiumBadge.show() : TankTrouble.TankInfoBox.premiumBadge.hide();
                betaTester ? TankTrouble.TankInfoBox.betaTesterBadge.show() : TankTrouble.TankInfoBox.betaTesterBadge.hide();
                adminMember ? TankTrouble.TankInfoBox.adminBadge.show() : TankTrouble.TankInfoBox.adminBadge.hide();
            } else {
                TankTrouble.TankInfoBox.infoBadgesDiv.hide();
            }

        }, () => {}, () => {}, playerId, Caches.getPlayerDetailsCache());
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址