Configuration

Configuration

All configuration lives in bablo-racing/config.lua. The file is not escrowed and is fully editable. Below is a reference for every section.

Changes to config.lua require a resource restart to take effect (restart bablo-racing in the console).


Debug

Config.Debug = false      -- Enable race debug tools (visible waypoints, console output)
Config.LogLevel = 'debug' -- Log verbosity: debug | trace | warn | error

General

Config.General.OpenByCommand = false  -- true = players can open the app via keybind without an item
Config.General.OpenKey = 'F5'         -- Keybind used when OpenByCommand is true
Config.General.VehicleImagesUrl = 'https://assets.example.com/vehicles/{car}.png'
Config.General.Tablet = `imp_prop_impexp_tablet`  -- Prop model used as the physical tablet

VehicleImagesUrl controls the images shown in the vehicle picker. Replace {car} with your asset CDN path — the resource substitutes the vehicle model name automatically.


Profiles

Config.Profiles.AllowCustomImages = false                         -- Let players set a custom profile picture URL
Config.Profiles.AllowAllDomains = true                           -- Allow any image domain
Config.Profiles.AllowedDomains = { "imgur.com", "discordapp.com" } -- Only used when AllowAllDomains = false
Config.Profiles.AllowAllSizes = true                             -- Allow images of any size
Config.Profiles.StartingElo = 500                                -- ELO new players start with
Config.Profiles.AllowAvatars = true                              -- Let players pick a generated avatar
Config.Profiles.AvatarTypes = { "avataaars-neutral", "pixel-art", "fun-emoji" }

Supported avatar styles:


Crews

Config.Crews.MemberCap = nil          -- nil = no cap, or set a number e.g. 10
Config.Crews.AllowCustomImages = false
Config.Crews.AllowAllDomains = true
Config.Crews.AllowAvatars = false
Config.Crews.AvatarTypes = { "avataaars-neutral", "pixel-art" }

Track Builder

Config.Trackbuilder.AllowCreation = true              -- Allow all players to create tracks
Config.Trackbuilder.AcePermission = "streetrace.trackbuilder"  -- ACE required when AllowCreation = false
Config.Trackbuilder.MaxCheckpoints = 99
Config.Trackbuilder.MinCheckpoints = 2
Config.Trackbuilder.CheckpointModel = "prop_offroad_tyres02"   -- Checkpoint prop
Config.Trackbuilder.StartpointModel = "prop_offroad_tyres01"   -- Start/finish prop
Config.Trackbuilder.DistanceBetweenCheckpoints = 20.0          -- Minimum metres between checkpoints
Config.Trackbuilder.CircuitMinimumDistanceBetweenFirstAndLastCheckpoint = 30.0

To restrict track creation to admins only, set AllowCreation = false and grant the ACE permission in your server config:

add_ace group.admin streetrace.trackbuilder allow

Races

Config.Races.DefaultTracks = true       -- Seed built-in tracks on first boot
Config.Races.MobilizeTimer = 10000      -- ms to prepare before countdown (default 10s)
Config.Races.CountdownTimer = 3000      -- ms for the countdown sequence (default 3s)
Config.Races.ToggleVehicleDrift = true  -- Apply drift tyres during races
Config.Races.FreezeDuringCountdown = true
Config.Races.MinCrewSize = 2            -- Min players per team in a crew lobby
Config.Races.AllowUnevenCrewSize = false
Config.Races.StartRadius = 100.00       -- metres: all players must be within this radius to start
Config.Races.RequirePlayersInStartRadius = true
Config.Races.RequiredParticipantsForRankedLobby = 4
Config.Races.Deadline = 60000          -- ms after first finish before lobby auto-closes
Config.Races.FinishedLobbyVisibilityTime = 300000  -- ms a finished lobby stays in the list

Wager currencies

Config.Races.WagerCurrencies = {
    'money',
    -- 'crypto'  -- uncomment to allow crypto wagers
}

Add the matching payout logic in Config.Rewards for any currency you enable here.

Ghost mode

Config.Races.Ghostmode = {
    distance = 20.0,   -- metres between cars before ghosting activates
    alpha = 200,       -- 0 (invisible) to 255 (opaque)
    scanInterval = 100 -- ms between distance scans (lower = more responsive, more CPU)
}

Gather smoke

Config.Races.GatherSmoke = {
    scale = 1.0,
    rgb = { r = 0.0, g = 0.0, b = 255.0 }  -- colour of start-line smoke
}

Sounds

Config.Races.Sounds = {
    Start      = { name = 'GO_NON_RACE',              set = 'HUD_MINI_GAME_SOUNDSET' },
    Checkpoint = { name = 'RACE_PLACED',               set = 'HUD_AWARDS' },
    DNF        = { name = 'FLIGHT_SCHOOL_LESSON_PASSED', set = 'HUD_AWARDS' },
    Finish     = { name = 'FLIGHT_SCHOOL_LESSON_PASSED', set = 'HUD_AWARDS' },
}

Road cleanup

Config.Races.Cleanup.Enable = true  -- Remove dumpsters, bins etc. that are on the track

The OnRoadModels and BlacklistedModels tables control which props are removed or protected.


Events

Config.Events.AllowCreation = true               -- Allow all players to create events
Config.Events.AcePermission = "streetrace.events"  -- ACE required when AllowCreation = false

UI

Config.UI.Colors = {
    Primary       = "#3C83F6",  -- Main accent (buttons, highlights)
    PrimaryLight  = "#6BA3F9",  -- Hover states, borders
    PrimaryDark   = "#2E6FDE",  -- Progress bars, emphasis
    Secondary     = "#415A77",  -- Cancel buttons, disabled states
    SecondaryHover = "#344E6B",
}
Config.UI.RouteColor = 12  -- GPS route colour (66 = yellow, 5 = lime green)

Environment

Config.Env.AutoRepairDB = true   -- Auto-create/repair missing DB tables on start (recommended)
Config.Env.Framework = "auto"    -- auto | esx | qb | qbox | ox | vrp2 | standalone
Config.Env.Inventory = "auto"    -- auto | ox_inventory | qb-inventory | lj-inventory | mf-inventory | codem-inventory | core_inventory | tprp_inventory

Vehicles

Config.Vehicles.Classes = { 'D', 'C', 'B', 'A', 'S', 'S+', 'M-', 'M', 'M+' }

The Get function returns the class for a given vehicle hash. By default it returns 'All' (no class restriction). Replace with your own logic to pull class from a vehicle database:

Config.Vehicles.Classes.Get = function(hash)
    local vehicleData = exports['my-cardealer']:GetVehicleDataByHash(hash)
    if not vehicleData then return nil end
    return vehicleData.class
end

The IsBlackListed function lets you prevent specific vehicles from joining lobbies:

Config.Vehicles.Classes.IsBlackListed = function(hash)
    return GetDisplayNameFromVehicleModel(hash) == "oppressor2"
end

Rewards

Config.Rewards.Winners = 3               -- Top X players share the wager payout
Config.Rewards.DefaultCurrency = "money"
Config.Rewards.Xp = {
    participant = 2,
    topX = 5,
    winner = 10
}

Race payout (cash)

Edit Config.Rewards.RacePayout to control how much money is awarded per finish position:

Config.Rewards.RacePayout = function(source, status)
    if status == 'winner' then
        return 100
    elseif status == 'topX' then
        return 50
    else
        return 5  -- participant
    end
end

Loot table (items)

Edit Config.Rewards.Loottable to give items on finish. Return nil to give nothing:

Config.Rewards.Loottable = function(source, status)
    if status == 'winner' then
        return {
            { item = 'repairkit', metadata = { ignoreChecks = true }, amount = 1 }
        }
    end
    return nil
end

ELO Ranks

Each rank entry defines the ELO range and optional rewards for reaching that rank:

Config.ELO.Ranks = {
    { name = 'Rookie',  min = 0,    max = 999,   rewards = nil },
    { name = 'Amateur', min = 1000, max = 1999,  rewards = { { type = "money", amount = 250 } } },
    -- ...
    { name = 'Apex',    min = 9000, max = 10000, rewards = {
        { type = 'item',  item = 'furniture', metadata = { model = 'm25_2_prop_m52_trpy_100races' }, amount = 1 },
        { type = "money", amount = 1500 }
    }},
}

rewards is paid out once when a player first reaches that rank tier. Set to nil for no reward.