您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
More Legible Font and custom color outlines for player names on honor bars. No API key required. Set your player ID manually for full reliability.
当前为
- // ==UserScript==
- // @name Torn: More Legible Player Names With Custom Color Outlines
- // @namespace http://tampermonkey.net/
- // @version 2
- // @description More Legible Font and custom color outlines for player names on honor bars. No API key required. Set your player ID manually for full reliability.
- // @author Gingerbeardman
- // @match https://www.torn.com/*
- // @grant none
- // @license GNU GPLv3
- // ==/UserScript==
- (function () {
- 'use strict';
- const MY_PLAYER_ID = 'USER ID #'; // ← Your player ID here
- const CONFIG_KEY = 'mlpn-config';
- const COLOR_OPTIONS = [
- { name: 'Black (Default)', value: '#000000' },
- { name: 'Red', value: '#ff4d4d' },
- { name: 'Blue', value: '#310AF5' },
- { name: 'Green', value: '#3B9932' },
- { name: 'Orange', value: '#ff9c40' },
- { name: 'Purple', value: '#c080ff' },
- { name: 'Yellow', value: '#f5d142' },
- { name: 'Pink', value: '#ff69b4' },
- { name: 'Teal', value: '#00d9c0' },
- { name: 'White', value: '#ffffff' },
- { name: 'Custom…', value: 'custom' }
- ];
- const loadFont = () => {
- const link = document.createElement('link');
- link.href = 'https://fonts.googleapis.com/css2?family=Manrope:wght@700&display=swap';
- link.rel = 'stylesheet';
- document.head.appendChild(link);
- };
- const injectStyles = () => {
- const style = document.createElement('style');
- style.textContent = COLOR_OPTIONS.filter(c => c.value !== 'custom').map(c => {
- const hex = c.value.replace('#', '');
- return `.mlpn-color-${hex} .custom-honor-text {
- text-shadow:
- -1px -1px 0 ${c.value},
- 1px -1px 0 ${c.value},
- -1px 1px 0 ${c.value},
- 1px 1px 0 ${c.value} !important;
- }`;
- }).join('\n') + `
- .custom-honor-text {
- font-family: 'Manrope', sans-serif !important;
- font-weight: 700 !important;
- color: white !important;
- text-transform: uppercase !important;
- letter-spacing: 0.5px !important;
- pointer-events: none !important;
- position: absolute !important;
- top: 50%;
- left: 0;
- transform: translateY(-50%);
- width: 100% !important;
- display: flex !important;
- align-items: center;
- justify-content: center;
- text-align: center !important;
- line-height: 1 !important;
- margin: 0 !important;
- padding: 0 !important;
- z-index: 10 !important;
- }
- .honor-text-svg {
- display: none !important;
- }
- .mlpn-panel {
- position: absolute;
- top: 50px;
- left: 50%;
- transform: translateX(-50%);
- background: #222;
- color: white;
- border: 1px solid #444;
- padding: 12px;
- z-index: 99999;
- font-size: 14px;
- border-radius: 6px;
- width: max-content;
- }
- .mlpn-panel label {
- display: block;
- margin-top: 10px;
- }
- .mlpn-button {
- background: #339CFF;
- color: white;
- border: none;
- padding: 6px 10px;
- font-weight: bold;
- border-radius: 4px;
- cursor: pointer;
- margin-top: 10px;
- }
- .mlpn-note {
- font-size: 12px;
- margin-top: 6px;
- color: #aaa;
- }
- `;
- document.head.appendChild(style);
- };
- const getConfig = () => JSON.parse(localStorage.getItem(CONFIG_KEY) || '{}');
- const saveConfig = config => localStorage.setItem(CONFIG_KEY, JSON.stringify(config));
- const createColorDropdown = (id, selectedValue) => {
- const select = document.createElement('select');
- select.id = id;
- COLOR_OPTIONS.forEach(c => {
- const opt = document.createElement('option');
- opt.value = c.value;
- opt.textContent = c.name;
- select.appendChild(opt);
- });
- select.value = COLOR_OPTIONS.some(c => c.value === selectedValue) ? selectedValue : 'custom';
- return select;
- };
- const showSettingsPanel = (isOwn, playerId) => {
- const config = getConfig();
- const panel = document.createElement('div');
- panel.id = 'mlpn-panel';
- panel.className = 'mlpn-panel';
- const closeBtn = document.createElement('button');
- closeBtn.className = 'mlpn-button';
- closeBtn.textContent = 'Done';
- closeBtn.onclick = () => panel.remove();
- if (isOwn) {
- panel.innerHTML = `
- <label>Font Size:
- <input id="mlpn-font-size" type="number" min="8" max="24" value="${config.fontSize || 12}" />
- </label>
- <label>Color for Your Name:</label>
- `;
- const dropdown = createColorDropdown('mlpn-my-color', config.myColor || '#000000');
- const customInput = document.createElement('input');
- customInput.id = 'mlpn-my-custom';
- customInput.placeholder = '#hex';
- customInput.style.display = dropdown.value === 'custom' ? 'block' : 'none';
- customInput.value = config.myColor?.startsWith('#') ? config.myColor : '';
- dropdown.onchange = () => {
- customInput.style.display = dropdown.value === 'custom' ? 'block' : 'none';
- config.myColor = dropdown.value === 'custom' ? customInput.value : dropdown.value;
- saveConfig(config);
- };
- customInput.oninput = () => {
- config.myColor = customInput.value;
- saveConfig(config);
- };
- const fontInput = panel.querySelector('#mlpn-font-size');
- fontInput.oninput = () => {
- config.fontSize = parseInt(fontInput.value);
- saveConfig(config);
- };
- document.body.appendChild(panel);
- panel.appendChild(dropdown);
- panel.appendChild(customInput);
- } else {
- panel.innerHTML = `<label>Assign a color to this player's name:</label>`;
- const dropdown = createColorDropdown('mlpn-other-color', config.players?.[playerId] || '#000000');
- const customInput = document.createElement('input');
- customInput.id = 'mlpn-other-custom';
- customInput.placeholder = '#hex';
- customInput.style.display = dropdown.value === 'custom' ? 'block' : 'none';
- customInput.value = config.players?.[playerId]?.startsWith('#') ? config.players[playerId] : '';
- dropdown.onchange = () => {
- if (!config.players) config.players = {};
- customInput.style.display = dropdown.value === 'custom' ? 'block' : 'none';
- config.players[playerId] = dropdown.value === 'custom' ? customInput.value : dropdown.value;
- saveConfig(config);
- };
- customInput.oninput = () => {
- if (!config.players) config.players = {};
- config.players[playerId] = customInput.value;
- saveConfig(config);
- };
- document.body.appendChild(panel);
- panel.appendChild(dropdown);
- panel.appendChild(customInput);
- }
- const note = document.createElement('div');
- note.className = 'mlpn-note';
- note.textContent = 'Refresh the page to apply settings.';
- panel.appendChild(note);
- panel.appendChild(closeBtn);
- };
- const getProfileIdFromUrl = () => {
- const match = window.location.href.match(/profiles\.php\?XID=(\d+)/);
- return match ? match[1] : null;
- };
- const applyHonorStyles = () => {
- const config = getConfig();
- const fontSize = parseInt(config.fontSize) || 12;
- const profileId = getProfileIdFromUrl();
- document.querySelectorAll('.honor-text-wrap').forEach(wrap => {
- if (wrap.querySelector('.custom-honor-text')) return;
- const anchor = wrap.closest('a[href*="XID="]');
- let playerId = null;
- if (anchor) {
- const match = anchor.href.match(/XID=(\d+)/);
- if (match) playerId = match[1];
- } else if (profileId) {
- playerId = profileId; // Fallback for profile pages
- }
- const text = wrap.getAttribute('data-title') || wrap.getAttribute('aria-label') || wrap.innerText || '';
- const cleaned = text.trim().toUpperCase();
- if (!cleaned) return;
- let color = '#000000';
- if (playerId === MY_PLAYER_ID && config.myColor) {
- color = config.myColor;
- } else if (config.players?.[playerId]) {
- color = config.players[playerId];
- }
- const colorClass = `mlpn-color-${color.replace('#', '')}`;
- wrap.classList.add(colorClass);
- if (fontSize > 12) wrap.style.height = `${fontSize + 6}px`;
- const div = document.createElement('div');
- div.className = 'custom-honor-text';
- div.style.fontSize = `${fontSize}px`;
- div.textContent = cleaned;
- wrap.appendChild(div);
- });
- };
- const injectSettingsButton = (isSelfProfile, profileId) => {
- if (document.getElementById('mlpn-settings-btn')) return;
- const target = document.querySelector('.content-title');
- if (!target) return;
- const btn = document.createElement('button');
- btn.id = 'mlpn-settings-btn';
- btn.className = 'mlpn-button';
- btn.textContent = 'Custom Player Names';
- btn.onclick = () => showSettingsPanel(isSelfProfile, profileId);
- target.appendChild(btn);
- };
- const init = () => {
- const profileId = getProfileIdFromUrl();
- if (profileId) {
- injectSettingsButton(profileId === MY_PLAYER_ID, profileId);
- }
- applyHonorStyles();
- new MutationObserver(applyHonorStyles).observe(document.body, { childList: true, subtree: true });
- };
- loadFont();
- injectStyles();
- init();
- })();