您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Keeps a record of which car you want to use for each racetrack and removes every other car from the selection menu.
// ==UserScript== // @name Auto Select Car // @namespace https://greasyfork.org/en/scripts/398078-auto-select-car // @version 1.4 // @description Keeps a record of which car you want to use for each racetrack and removes every other car from the selection menu. // @author Cryosis7 [926640] // @match https://www.torn.com/loader.php?sid=racing // ==/UserScript== /** * Car stats are used to distinguish between the different cars. * Only requires the name field, which can be a substring (NSX, LFA etc.) * The qualifiers like 'top speed' are used to differeniate between different versions of the same model car (Dirt NSX vs Tarmac NSX) */ const cars = { 'Ferrari458_TarmacLong3': { 'name': 'Ferrari 458' }, 'LexusLFA_TarmacLong3': { 'name': 'LFA', 'Top Speed': '260' }, 'HondaNSX_TarmacShort3': { 'name': 'NSX', 'Top Speed': '242', 'Brake Dist': '72' }, 'HondaNSX_DirtShort3': { 'name': 'NSX', 'Top Speed': '240', 'Brake Dist': '72' }, 'ReliantRobin': { 'name': 'Reliant Robin' } }; /** * Used for mapping the race-track to the car you want to race. * To have multiple cars show, wrap them in an array like so: (Don't forget the commas) * 'Docks': [cars.LexusLFA_TarmacLong3, cars.ReliantRobin], */ const car_track_mappings = { 'Docks': [cars.LexusLFA_TarmacLong3, cars.ReliantRobin], 'Uptown': cars.LexusLFA_TarmacLong3, 'Withdrawal': cars.LexusLFA_TarmacLong3, 'Speedway': cars.LexusLFA_TarmacLong3, 'Convict': cars.LexusLFA_TarmacLong3, 'Meltdown': cars.HondaNSX_TarmacShort3, 'Industrial': cars.HondaNSX_TarmacShort3, 'Vector': cars.HondaNSX_TarmacShort3, 'Underdog': cars.HondaNSX_TarmacShort3, 'Commerce': cars.HondaNSX_TarmacShort3, 'Sewage': cars.HondaNSX_TarmacShort3, 'Mudpit': cars.HondaNSX_DirtShort3, 'Two Islands': cars.HondaNSX_DirtShort3, 'Stone Park': cars.HondaNSX_DirtShort3, 'Parkland': cars.HondaNSX_DirtShort3, 'Hammerhead': cars.HondaNSX_DirtShort3 }; /** * This can be used to help configure when you want the auto-selector to run. */ const CONFIG = { 'ENABLED_ON_OFFICIAL': true, 'ENABLED_ON_CUSTOM': true } // Creates the observer when the page loads. $(() => createObserver()); /** * Creates an observer that watches to see when the player tries to change their car. */ function createObserver() { const raceContainer = $('#racingAdditionalContainer')[0]; var observer = new MutationObserver(function(mutations) { for (let mutation of mutations) { if ($(mutation.addedNodes).find('ul.enlist-list') && checkEnabled()) filterCars($(mutation.addedNodes).find('ul.enlist-list').children()) } }); observer.observe(raceContainer, { childList: true }); } /** * Goes through the list of cars, checking them against the criteria. * If the car does not meet the criteria, the car is hidden. * @param {The selector for the list of cars.} carList */ function filterCars(carList) { var racetrack = $('div.enlist-wrap:contains("Current race") div.enlisted-btn-wrap:contains(" - ")').text().trim().split(' - ')[0]; var desiredCarArray = Array.isArray(car_track_mappings[racetrack]) ? car_track_mappings[racetrack] : [car_track_mappings[racetrack]]; $(carList).each((index, element) => { let carIsPermitted = false; // Whether this car(element on page) matches any cars in the list of permitted cars. for (let validCar of desiredCarArray) { // loops through every car that is permitted. let carMatchesValidCar = false; // For testing if the car element matches the permitted car for (let stat in validCar) { if (stat === 'name') carMatchesValidCar = scrubText($(element).find('.remove-info')[0].innerText).includes(scrubText(validCar.name)) else { let carStats = scrubText($(element).find('.enlisted-stat')[0].innerText); if (carStats.includes(scrubText(stat))) { if (!carStats.split(scrubText(stat))[1].startsWith(scrubText(validCar[stat]))) carMatchesValidCar = false; } } if (!carMatchesValidCar) break; } carIsPermitted = carIsPermitted || carMatchesValidCar; } if (!carIsPermitted) $(element).hide() }); } /** * Generic method to clean up text for comparisons. * @param {Text to be scrubbed} text */ function scrubText(text) { return text.toLowerCase().replace(/[^a-z0-9]*/g, ''); } /** * Helper function that checks the config to see if the script is enabled for the current race */ function checkEnabled() { if ($('div.enlisted-btn-wrap:contains("Official race")').length && CONFIG.ENABLED_ON_OFFICIAL) return true; else if ($('div.enlisted-btn-wrap:contains(" - "):not(:contains("Official race"))').length && CONFIG.ENABLED_ON_CUSTOM) return true; return false; }