您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tools to help with Bootlegging
当前为
// ==UserScript== // @name TC Bootlegging Plus v2 // @namespace DieselBladeScripts // @version 0.95 // @description Tools to help with Bootlegging // @license GPLv3 // @author DieselBlade [1701621], Hemicopter [2780600] // @match https://www.torn.com/loader.php?sid=crimes* // @match https://torn.com/loader.php?sid=crimes* // @grant unsafeWindow // @run-at document-start // @grant GM_xmlhttpRequest // ==/UserScript== const isTampermonkeyEnabled = typeof unsafeWindow !== 'undefined'; const win = isTampermonkeyEnabled ? unsafeWindow : window; const {fetch: originalFetch} = win; win.fetch = async (...args) => { const response = args.length == 2 ? await originalFetch(args[0], args[1]) : await originalFetch(args[0]); let url = args[0]; if(typeof url === "object") url = url.url; if (url.includes('crimesData')) { crimesMain(response.clone()).catch(console.error); } return response; }; async function crimesMain(res) { const crimesData = await res.json(); const crimeType = crimesData?.DB?.currentUserStatistics?.[1]?.value; if (crimeType === 'Counterfeiting') { counterfeiting(crimesData.DB); } else { console.log(crimesData); } } async function counterfeiting(db) { const { generalInfo, currentUserStats, crimesByType } = db; const CDs = { have: generalInfo.CDs, sold: { 1: currentUserStats.CDType1Sold, 2: currentUserStats.CDType2Sold, 3: currentUserStats.CDType3Sold, 4: currentUserStats.CDType4Sold, 5: currentUserStats.CDType5Sold, 6: currentUserStats.CDType6Sold, 7: currentUserStats.CDType7Sold, 8: currentUserStats.CDType8Sold }, genres: { 'Action': '1', 'Comedy': '2', 'Drama': '3', 'Fantasy': '4', 'Horror': '5', 'Romance': '6', 'Thriller': '7', 'Sci-Fi': '8' } }; const currentQueue = crimesByType?.['0']?.additionalInfo?.currentQueue || []; currentQueue.forEach(cdID => CDs.have[cdID] += 1); const observer = new MutationObserver(() => { const genreButtons = document.querySelectorAll('button[class^=genreStock]'); if (genreButtons.length > 0) { updateGenreButtons(CDs); observer.disconnect(); } }); observer.observe(document, { childList: true, subtree: true }); } function updateGenreButtons(CDs) { const GREEN_HSL = 120; // Green for excess copies const RED_HSL = 0; // Red for biggest shortages const totalHave = sumValues(CDs.have); const totalSold = sumValues(CDs.sold); let maxShortage = 0; // Track the worst shortage // First pass: Determine the maximum shortage document.querySelectorAll('button[class^=genreStock]').forEach((genreButton) => { const genre = genreButton.getAttribute('aria-label').split(' - ')[0].replace('Copying ', ''); const typeID = CDs.genres[genre]; const target = Math.floor((CDs.sold[typeID] / totalSold) * totalHave); const diff = target - CDs.have[typeID]; // Positive means more are needed, negative means excess if (diff > maxShortage) { maxShortage = diff; // Store the highest shortage } }); // Second pass: Apply colors based on shortage severity document.querySelectorAll('button[class^=genreStock]').forEach((genreButton) => { const genre = genreButton.getAttribute('aria-label').split(' - ')[0].replace('Copying ', ''); const typeID = CDs.genres[genre]; const target = Math.floor((CDs.sold[typeID] / totalSold) * totalHave); const diff = target - CDs.have[typeID]; // Positive means more are needed, negative means excess let h; if (diff > 0) { // Shortage: scale from red (0) to neutral h = RED_HSL + (1 - diff / maxShortage) * (GREEN_HSL - RED_HSL); } else { // Excess: Make it green h = GREEN_HSL; } genreButton.style.backgroundColor = `hsl(${h}, 100%, 90%)`; // Ensure text remains readable genreButton.style.color = "#888"; // Ensure button text is dark grey // Update the "copying" text color const statusText = genreButton.querySelector('.statusText___fRZso'); if (statusText) { statusText.style.color = "#888"; } // Update the text for how many more are needed or if there are excess copies const existingDiffText = genreButton.querySelector('.diffText'); if (existingDiffText) { existingDiffText.remove(); } const diffText = document.createElement('div'); diffText.className = 'diffText'; diffText.textContent = diff > 0 ? `${diff} more needed` : 'Excess copies'; diffText.style.color = "#888"; // Ensure text remains readable genreButton.appendChild(diffText); }); } function sumValues(obj) { return Object.values(obj).reduce((a, b) => a + b, 0); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址