Auto Select Car

Keeps a record of which car you want to use for each racetrack and removes every other car from the selection menu.

安装此脚本?
作者推荐脚本

您可能也喜欢Race Filter

安装此脚本
// ==UserScript==
// @name         Auto Select Car
// @namespace    https://gf.qytechs.cn/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;
}

QingJ © 2025

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