Config file

Config = {}

-- Base locale used for UI texts and notifications.
Config.Locale = 'en' -- da/en

-- Command/Keybind configuration for opening the tuner.
Config.Command = {
    enabled = true,
    name = 'kexhaust',
    defaultKey = 'F7',
    allowKeyMapping = true
}

-- Default exhaust state applied when nothing has been saved yet.
Config.DefaultState = {
    valveMode = 'auto',
    autoStrategy = 'rpm',
    tone = 50,
    volume = 70,
    burble = 30,
    crackle = 20,
    idle = 40
}

-- Safety limits to prevent abuse – all slider values are clamped to these ranges.
Config.Limits = {
    tone = { min = 0, max = 100 },
    volume = { min = 0, max = 100, cap = 85 },
    burble = { min = 0, max = 100, cap = 75 },
    crackle = { min = 0, max = 100, cap = 65 },
    idle = { min = 0, max = 100, cap = 80 }
}

local function buildBackfireSampleList(prefix, count)
    local list = {}
    for index = 1, count do
        list[index] = ('assets/audio/%s %d.ogg'):format(prefix, index)
    end
    return list
end

local BackfireSamplePaths = {
    pop = buildBackfireSampleList('pop', 5),
    limiter = buildBackfireSampleList('limiter pop', 6)
}

-- Valve modes & auto strategies – values are kept language agnostic while labels live in locales.
Config.ValveModes = {
    order = { 'auto', 'open', 'closed' },
    labels = {
        auto = { da = 'Auto', en = 'Auto' },
        open = { da = 'Åben', en = 'Open' },
        closed = { da = 'Lukket', en = 'Closed' }
    }
}

Config.AutoStrategies = {
    order = { 'rpm', 'speed', 'timed' },
    labels = {
        rpm = { da = 'Auto (Omdr./Belastning)', en = 'Auto (RPM/Load)' },
        speed = { da = 'Auto (Hastighed)', en = 'Auto (Speed)' },
        timed = { da = 'Auto (Tidsbaseret)', en = 'Auto (Timer)' }
    }
}

-- Presets available inside the UI. Values follow the slider scale (0-100).
Config.Presets = {
    order = { 'quiet', 'sport', 'track', 'show' },
    defaultPrimary = 'sport',
    labels = {
        quiet = { da = 'Stille', en = 'Quiet' },
        sport = { da = 'Sport', en = 'Sport' },
        track = { da = 'Bane', en = 'Track' },
        show = { da = 'Show', en = 'Show' }
    },
    data = {
        quiet = { tone = 40, volume = 35, burble = 5, crackle = 0, idle = 25 },
        sport = { tone = 55, volume = 70, burble = 30, crackle = 20, idle = 40 },
        track = { tone = 45, volume = 85, burble = 55, crackle = 40, idle = 55 },
        show = { tone = 65, volume = 85, burble = 75, crackle = 65, idle = 60 }
    }
}

-- Maps tone levels to existing GTA sound sets.
Config.AudioProfiles = {
    { maxTone = 25, sound = 'dominator' },
    { maxTone = 50, sound = 'sultanrs' },
    { maxTone = 75, sound = 'comet' },
    { maxTone = 100, sound = 'italigtb' }
}

-- Vehicle specific presets applied automatically when a supported model is driven for the first time.
-- Focuses on Los Santos Tuners vehicles with a more aggressive burble/crackle mix and louder output.
Config.VehicleProfileOverrides = {
    calico = { tone = 60, volume = 83, burble = 58, crackle = 46, idle = 42 },
    comet6 = { tone = 75, volume = 84, burble = 60, crackle = 50, idle = 45 },
    cypher = { tone = 66, volume = 82, burble = 57, crackle = 46, idle = 42 },
    dominator7 = { tone = 70, volume = 85, burble = 70, crackle = 60, idle = 48 },
    euros = { tone = 65, volume = 82, burble = 58, crackle = 45, idle = 43 },
    futo2 = { tone = 52, volume = 76, burble = 54, crackle = 44, idle = 37 },
    growler = { tone = 73, volume = 83, burble = 63, crackle = 52, idle = 46 },
    jester4 = { tone = 68, volume = 82, burble = 62, crackle = 48, idle = 45 },
    previon = { tone = 62, volume = 79, burble = 52, crackle = 42, idle = 41 },
    remus = { tone = 58, volume = 80, burble = 60, crackle = 50, idle = 40 },
    rt3000 = { tone = 55, volume = 78, burble = 55, crackle = 40, idle = 38 },
    sultanrs = { tone = 60, volume = 84, burble = 68, crackle = 56, idle = 44 },
    sultan3 = { tone = 57, volume = 81, burble = 61, crackle = 50, idle = 44 },
    tailgater2 = { tone = 50, volume = 77, burble = 48, crackle = 38, idle = 36 },
    vectre = { tone = 63, volume = 80, burble = 56, crackle = 44, idle = 40 },
    warrener2 = { tone = 48, volume = 78, burble = 60, crackle = 52, idle = 38 },
    zr350 = { tone = 72, volume = 84, burble = 64, crackle = 52, idle = 47 }
}

-- Audio multipliers for subtle variation. Values are intentionally conservative.
Config.AudioTuning = {
    volumePressure = { min = 0.05, max = 0.65 },
    idleRpm = { min = 0.25, max = 0.6 },
    burbleTurbo = { min = 0.0, max = 0.9 },
    crackleIntensity = { min = 0.0, max = 0.85 }
}

-- Backfire pop sound configuration. Each vehicle uses the sound set defined below when
-- burble/crackle values are high enough. Add/remove models or change file paths here
-- if the supplied samples don't fit your server's balance.
Config.BackfireAudio = {
    enabled = true,
    -- When true, the resource mutes GTA's built-in backfire pops and replaces them with
    -- the provided NUI samples instead. Disable this if you prefer the vanilla sound.
    replaceGamePopAudio = true,
    -- Audio flag used to silence the default pop effect. Different mods may want to
    -- customise this value if they rely on other audio tweaks.
    replaceAudioFlag = 'DisableVehicleEnginePopSound',
    -- Optional fallback set if a vehicle isn't explicitly listed below.
    defaultSet = nil,
    -- Detection tuning
    tickInterval = 140, -- ms between detection checks
    minSpeedMph = 15.0, -- ignore pops while rolling slowly
    minRpm = 0.35,
    limiterRpm = 0.88,
    throttleActiveThreshold = 0.42,
    throttleReleaseThreshold = 0.18,
    rpmDrop = 0.12,
    burbleThreshold = 35,
    crackleThreshold = 30,
    -- Behaviour tuning
    popChance = 0.78,
    limiterChance = 0.54,
    popCooldown = { min = 220, max = 360 },
    limiterCooldown = { min = 360, max = 540 },
    -- Audio levels
    baseVolume = 0.35,
    limiterVolume = 0.45,
    burbleVolumeScale = 0.25,
    crackleVolumeScale = 0.18,
    -- Sound sets (paths are relative to the resource root)
    sets = {
        tuner = {
            pop = BackfireSamplePaths.pop,
            limiter = BackfireSamplePaths.limiter
        }
    },
    -- Vehicles (by model name) mapped to the sound set above.
    vehicleSets = {
        calico = 'tuner',
        comet6 = 'tuner',
        cypher = 'tuner',
        dominator7 = 'tuner',
        euros = 'tuner',
        futo2 = 'tuner',
        growler = 'tuner',
        jester4 = 'tuner',
        previon = 'tuner',
        remus = 'tuner',
        rt3000 = 'tuner',
        sultan3 = 'tuner',
        sultanrs = 'tuner',
        tailgater2 = 'tuner',
        vectre = 'tuner',
        warrener2 = 'tuner',
        zr350 = 'tuner'
    }
}

-- Automatically reapply the player's saved profile when they enter a new vehicle as the driver.
Config.AutoApplySavedProfile = true

-- Interval (ms) for pruning stale vehicle states server-side. Set to 0 to disable.
Config.StateCleanupInterval = 60000

-- Locale strings – add further languages by following the same structure.
Config.Locales = {
    da = {
        ui = {
            headerPath = 'Klobow Audio • Exhaust Module',
            title = 'K-Exhaust Tuner',
            labels = {
                valveMode = 'Ventiltilstand',
                autoStrategy = 'Auto strategi',
                tone = 'Tone (mørk → lys)',
                volume = 'Udstødningsvolumen',
                burble = 'Burble intensitet',
                crackle = 'Crackle længde',
                idle = 'Tomgangs lydstyrke'
            },
            help = {
                tone = 'Changer "klang"/fremtoning. 0% = dyb/boomy • 100% = lys/raspy',
                burble = 'Off-throttle & decel pops',
                crackle = 'Hvor længe efter gas-slip'
            },
            buttons = {
                save = 'Gem profil',
                apply = 'Anvend'
            },
            toasts = {
                profileSaved = 'Profil gemt',
                applied = 'Indstillinger anvendt',
                trimmed = 'Nogle værdier blev justeret af sikkerhedssystemet'
            }
        },
        notifications = {
            noVehicle = 'Du skal være i et køretøj for at bruge tuneren.',
            driverOnly = 'Du skal sidde på førersædet.',
            applied = 'Udstødningsprofilen er aktiveret.',
            profileSaved = 'Din udstødningsprofil er gemt server-side.',
            valuesTrimmed = 'Følgende værdier blev sænket: {fields}'
        },
        command = {
            description = 'Åbn Klobow Exhaust tuneren'
        }
    },
    en = {
        ui = {
            headerPath = 'Klobow Audio • Exhaust Module',
            title = 'K-Exhaust Tuner',
            labels = {
                valveMode = 'Valve mode',
                autoStrategy = 'Auto strategy',
                tone = 'Tone (dark → bright)',
                volume = 'Exhaust volume',
                burble = 'Burble intensity',
                crackle = 'Crackle length',
                idle = 'Idle loudness'
            },
            help = {
                tone = 'Changes the colour/character of the sound. 0% = deep/boomy • 100% = bright/raspy',
                burble = 'Off-throttle & deceleration pops',
                crackle = 'How long the crackle continues after throttle lift'
            },
            buttons = {
                save = 'Save profile',
                apply = 'Apply'
            },
            toasts = {
                profileSaved = 'Profile saved',
                applied = 'Settings applied',
                trimmed = 'Some values were reduced by the safety system'
            }
        },
        notifications = {
            noVehicle = 'You need to be in a vehicle to use the tuner.',
            driverOnly = 'You need to be in the driver seat.',
            applied = 'Exhaust profile activated.',
            profileSaved = 'Your exhaust profile has been saved server-side.',
            valuesTrimmed = 'The following values were lowered: {fields}'
        },
        command = {
            description = 'Open the Klobow Exhaust tuner'
        }
    }
}

Last updated