Configuration

Discord Support

Complete configuration reference for nc-busjob. All settings are in shared/config.lua.

Framework

Config.Framework = 'auto'  -- 'auto' | 'qb' | 'qbox' | 'esx' | 'ox'

Target System

Config.Target = 'auto'  -- 'auto' | 'ox_target' | 'qb-target' | 'qtarget' | 'interact'

General

Config.Debug = false
Config.Locale = 'en'

Commands & Keybinds

Config.Commands = {
    openRoutes = { name = 'busloop', description = '...', key = 'F7' },
    cancelRoute = { name = 'buscancel', description = '...', key = '' },
}

Loop / Lap Settings

Config.Loop = {
    maxLaps = 5,              -- Maximum laps a player can select (1-10)
    bonusMultiplier = 0.5,    -- Extra completion bonus per additional lap (+50% per lap)
}

Time-Based Demand System

Dynamic multipliers based on in-game time of day. Affects passenger spawns, tip rates, and fare pricing.

Config.TimeDemand = {
    enabled = true,
    periods = {
        { name = 'morningRush',  startHour = 7,  endHour = 9,  passengerMultiplier = 2.0, tipMultiplier = 1.5, fareMultiplier = 1.0 },
        { name = 'daytime',      startHour = 9,  endHour = 17, passengerMultiplier = 1.0, tipMultiplier = 1.0, fareMultiplier = 1.0 },
        { name = 'eveningRush',  startHour = 17, endHour = 19, passengerMultiplier = 2.0, tipMultiplier = 1.5, fareMultiplier = 1.0 },
        { name = 'evening',      startHour = 19, endHour = 22, passengerMultiplier = 1.2, tipMultiplier = 1.2, fareMultiplier = 1.0 },
        { name = 'lateNight',    startHour = 22, endHour = 2,  passengerMultiplier = 0.5, tipMultiplier = 1.8, fareMultiplier = 1.3 },
        { name = 'earlyMorning', startHour = 2,  endHour = 7,  passengerMultiplier = 0.3, tipMultiplier = 2.0, fareMultiplier = 1.3 },
    },
    weekend = {
        enabled = true,
        days = { 0, 6 },                -- 0 = Sunday, 6 = Saturday
        passengerMultiplier = 0.8,       -- Fewer commuters
        tipMultiplier = 1.3,             -- Tourists tip more
        vipWeightBonus = 15,             -- Extra VIP event weight
    },
}
Period Hours Passengers Tips Fare
Morning Rush 7:00–9:00 2.0x 1.5x 1.0x
Daytime 9:00–17:00 1.0x 1.0x 1.0x
Evening Rush 17:00–19:00 2.0x 1.5x 1.0x
Evening 19:00–22:00 1.2x 1.2x 1.0x
Late Night 22:00–2:00 0.5x 1.8x 1.3x
Early Morning 2:00–7:00 0.3x 2.0x 1.3x

Daily Challenges

Config.DailyChallenges = {
    enabled = true,
    count = 3,               -- Number of challenges per day
    resetHour = 6,           -- Reset hour (server time, 0-23)
    pool = {
        -- Types: 'trips', 'passengers', 'earnings', 'perfectRating', 'laps'
        { type = 'trips',          target = 3,    reward = 150,  icon = 'fa-route',       difficulty = 'easy' },
        { type = 'trips',          target = 5,    reward = 300,  icon = 'fa-route',       difficulty = 'medium' },
        { type = 'trips',          target = 8,    reward = 500,  icon = 'fa-route',       difficulty = 'hard' },
        { type = 'passengers',     target = 15,   reward = 100,  icon = 'fa-users',       difficulty = 'easy' },
        { type = 'passengers',     target = 30,   reward = 250,  icon = 'fa-users',       difficulty = 'medium' },
        { type = 'passengers',     target = 50,   reward = 450,  icon = 'fa-users',       difficulty = 'hard' },
        { type = 'earnings',       target = 500,  reward = 200,  icon = 'fa-dollar-sign', difficulty = 'easy' },
        { type = 'earnings',       target = 1500, reward = 400,  icon = 'fa-dollar-sign', difficulty = 'medium' },
        { type = 'earnings',       target = 3000, reward = 700,  icon = 'fa-dollar-sign', difficulty = 'hard' },
        { type = 'perfectRating',  target = 1,    reward = 250,  icon = 'fa-star',        difficulty = 'medium' },
        { type = 'perfectRating',  target = 3,    reward = 600,  icon = 'fa-star',        difficulty = 'hard' },
        { type = 'laps',           target = 5,    reward = 150,  icon = 'fa-repeat',      difficulty = 'easy' },
        { type = 'laps',           target = 10,   reward = 350,  icon = 'fa-repeat',      difficulty = 'medium' },
        { type = 'laps',           target = 20,   reward = 600,  icon = 'fa-repeat',      difficulty = 'hard' },
    },
}

Bus Condition Management

Config.BusCondition = {
    enabled = true,
    fuel = {
        enabled = true,
        startLevel = 100.0,          -- Starting fuel %
        consumptionRate = 0.02,      -- Fuel % per second while moving
        idleRate = 0.004,            -- Fuel % per second while idle
        warningThreshold = 25.0,     -- Yellow warning below this %
        criticalThreshold = 10.0,    -- Red critical below this %
        refuelCostPerPercent = 3,    -- Cost per 1% fuel at depot
    },
    condition = {
        enabled = true,
        warningThreshold = 40.0,     -- Yellow warning
        criticalThreshold = 20.0,    -- Red warning + speed penalty
        speedPenalty = 0.6,          -- Speed multiplier when critical (40% reduction)
        repairCostPerPercent = 8,    -- Cost per 1% repair at depot
    },
    repairAtDepot = true,            -- Auto repair/refuel on return (cost deducted)
}

Driving Rating System

5-star rating system that tracks driving behavior during routes. Affects tips and completion bonus.

Config.DrivingRating = {
    enabled = true,
    startScore = 100,         -- Starting score (max 100)
    penalties = {
        hardBrake = {
            enabled = true,
            deduction = 5,          -- Score per hard brake
            speedThreshold = 30,    -- Min speed (km/h) to trigger
            decelThreshold = 15,    -- Speed drop per check
            cooldown = 3000,        -- ms cooldown
        },
        collision = {
            enabled = true,
            deduction = 10,         -- Score per collision
            cooldown = 5000,
        },
        speeding = {
            enabled = true,
            deduction = 2,          -- Score per speeding tick
            speedLimit = 80,        -- Speed limit (km/h)
            interval = 5000,        -- Check interval (ms)
        },
        runRedLight = {
            enabled = true,
            deduction = 15,         -- Score per red light
            cooldown = 10000,
        },
    },
    stars = {
        { min = 90, stars = 5, label = 'Excellent' },
        { min = 75, stars = 4, label = 'Good' },
        { min = 55, stars = 3, label = 'Average' },
        { min = 35, stars = 2, label = 'Poor' },
        { min = 0,  stars = 1, label = 'Terrible' },
    },
    tipBonus = {
        [5] = 2.0,   -- 5 stars: tip chance doubled
        [4] = 1.5,   [3] = 1.0,   [2] = 0.5,   [1] = 0.0,
    },
    completionBonusMultiplier = {
        [5] = 1.25,  -- 5 stars: +25% completion bonus
        [4] = 1.1,   [3] = 1.0,   [2] = 0.8,   [1] = 0.5,
    },
}

Bus Depot

Config.Depot = {
    coords = vector3(463.84, -576.1, 28.5),
    blip = { enabled = true, sprite = 513, color = 47, scale = 0.8, label = 'Bus Depot' },
    busSpawnPoint = vector4(462.95, -605.85, 28.5, 213.18),
    parkingZone = { coords = vector3(462.95, -605.85, 28.5), radius = 10.0 },
    npcs = {
        dispatch = {
            model = 's_m_y_airworker',
            coords = vector4(458.08, -596.84, 28.5, 235.08),
            scenario = 'WORLD_HUMAN_STAND_MOBILE',
            label = 'Bus Dispatch',
            icon = 'fas fa-bus',
        },
    },
}

Buses

Config.Buses = {
    { model = 'bus',    label = 'City Bus',       maxPassengers = 15, requiredLevel = 1 },
    { model = 'airbus', label = 'Airport Shuttle', maxPassengers = 20, requiredLevel = 2 },
    { model = 'coach',  label = 'Luxury Coach',    maxPassengers = 25, requiredLevel = 3 },
}

Player Levels

Config.Levels = {
    [1] = { name = 'Newcomer',    requiredTrips = 0,    bonus = 0 },
    [2] = { name = 'Growing',     requiredTrips = 50,   bonus = 5 },
    [3] = { name = 'Established', requiredTrips = 150,  bonus = 10 },
    [4] = { name = 'Major',       requiredTrips = 400,  bonus = 15 },
    [5] = { name = 'Premium',     requiredTrips = 1000, bonus = 20 },
}

Fare System

Config.Fare = {
    baseFare = 3,
    zoneExtraFare = 1,
    nightSurcharge = 30,      -- % surcharge
    nightStart = 22,
    nightEnd = 6,
    studentDiscount = 30,     -- % discount
    elderlyDiscount = 50,     -- % discount
}

Payment System

Config.Payment = {
    cardChance = 40,
    cashExactChance = 25,
    cashOverpayChance = 30,
    cashUnderpayChance = 5,
    cardProcessTime = 1500,
    cardFailChance = 5,
    denominations = { 20, 10, 5, 1 },
    changeTimeLimit = 15,
    tipChance = 20,
    tipMin = 1,
    tipMax = 3,
    cameraTransitionTime = 800,
    cameraOffset = vector3(0.0, 0.5, 0.7),
}

Routes

5 default routes included. Add unlimited custom routes manually or via the Route Builder tool.

Config.Routes[6] = {
    id = 6,
    name = 'My Custom Route',
    description = 'A custom route created with route builder',
    color = '#9333ea',
    requiredLevel = 1,
    basePay = 60,
    completionBonus = 120,
    estimatedTime = 20,
    stops = {
        { id = 1, name = 'Stop A', coords = vector4(x, y, z, heading), waitTime = 10, minNPC = 1, maxNPC = 5, zone = 1 },
        { id = 2, name = 'Stop B', coords = vector4(x, y, z, heading), waitTime = 10, minNPC = 1, maxNPC = 5, zone = 1 },
    },
}

See the Customization page for the Route Builder guide.

NPC Settings

Config.NPC = {
    types = {
        { type = 'normal',  chance = 50, fareMultiplier = 1.0 },
        { type = 'student', chance = 20, fareMultiplier = 0.7 },
        { type = 'elderly', chance = 15, fareMultiplier = 0.5 },
        { type = 'tourist', chance = 10, fareMultiplier = 1.2 },
        { type = 'vip',     chance = 5,  fareMultiplier = 1.5 },
    },
    boardingTime = 3000,
    alightingTime = 2000,
    maxWaitAtStop = 30,
    minRideStops = 1,
    maxRideStops = 4,
}

NPC Speech

Config.NpcSpeech = {
    card = { ... },           -- Card payment lines
    cashExact = { ... },      -- Exact cash lines
    cashOver = { ... },       -- Overpay lines (asking for change)
    cashUnder = { ... },      -- Underpay lines
    changeReceived = { ... }, -- After receiving change
    cardFailed = { ... },     -- Card fail lines
    tip = { ... },            -- Tip lines
    fareEvader = { ... },     -- Fare evader event lines
    drunk = { ... },          -- Drunk passenger event lines
    sick = { ... },           -- Sick passenger event lines
    vipGreeting = { ... },    -- VIP pickup event lines
}

Sound Effects

Config.Sounds = {
    cardBeep     = { name = 'Beep_Green',          ref = 'DLC_HEIST_HACKING_SNAKE_SOUNDS' },
    cardFail     = { name = 'Beep_Red',             ref = 'DLC_HEIST_HACKING_SNAKE_SOUNDS' },
    cashRegister = { name = 'PICK_UP',              ref = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    changeReturn = { name = 'PICK_UP_COLLECTIBLE',  ref = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    doorOpen     = { name = 'SELECT',               ref = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    doorClose    = { name = 'BACK',                 ref = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    routeComplete = { name = 'CHALLENGE_UNLOCKED',  ref = 'HUD_AWARDS' },
}

UI Settings

Config.UI = { drag = false, position = { x = 50, y = 50 } }

Random Event System

Config.Events = {
    enabled = true,
    triggerChance = 15,
    minStopsBetween = 3,
    fareEvader = {
        enabled = true, weight = 35, reportBonus = 10,
        models = { 'a_m_y_skater_01', 'a_m_y_stwhi_02', 'a_f_y_hippie_01' },
    },
    drunkPassenger = {
        enabled = true, weight = 25, kickDelay = 5000,
        models = { 'a_m_m_tramp_01', 'a_m_m_stlat_02', 'a_m_y_mexthug_01' },
    },
    sickPassenger = {
        enabled = true, weight = 20, hospitalBonus = 50,
        hospitalCoords = vector3(-449.67, -340.83, 34.50),
        hospitalRadius = 30.0,
    },
    vipPickup = {
        enabled = true, weight = 20, bonusMin = 30, bonusMax = 80,
        models = { 'a_m_m_bevhills_02', 'a_f_m_bevhills_01', 'a_m_y_business_03' },
    },
}

Last updated: February 28, 2026

Last updated 1 month ago