Configuration

All core settings are located in shared/sh_config.lua.

Config = {}
-- Debug Mode
Config.Debug = true

-- Framework Configuration
Config.Framework = 'auto' -- 'esx', 'qb', 'qbox' or 'auto'
Config.Inventory = 'auto' -- 'ox_inventory', 'qb-inventory', 'qs-inventory' or 'auto'
Config.Target = 'auto'    -- 'ox_target', 'qb-target', 'qtarget', or 'auto'

-- Job Settings
Config.JobName = 'towtruck' -- Job Name
Config.RequireJob = true -- 'true' to require job, 'false' to allow doing job without being in the job
Config.PaymentAccount = 'bank' -- For QBCore use 'cash', 'bank' And For ESX use 'money' or 'bank'


-- Boss Ped Configuration
Config.BossPed = {
    model = 'a_m_m_hillbilly_02',
    coords = vector4(408.91, -1623.28, 28.29, 231.5),
    scenario = 'WORLD_HUMAN_CLIPBOARD',
    blip = {
        sprite = 68,
        color = 5,
        scale = 0.8,
        name = "Tow Truck Company"
    }
}

-- Blip Settings
Config.BlipSettings = {
    brokenVehicle = {
        sprite = 68,
        color = 1,
        scale = 0.6
    }
}

-- XP System Configuration
Config.XPSystem = {
    enabled = true,
    maxLevel = 50,
    baseXP = 100,       -- XP needed for level 1->2
    xpMultiplier = 1.5, -- Multiplier for each level

    -- XP Rewards
    rewards = {
        hookVehicle = 15,
        deliverVehicle = 25,
        completeRoute = 100,
        inspectVehicle = 5,
        emergencyUnhook = -10, -- Penalty
        perfectDelivery = 50,  -- Bonus for quick delivery
        bonusTime = 30         -- Bonus for delivering within time limit
    },

    -- Level Benefits
    levelBenefits = {
        [5] = { payBonus = 0.1, unlockMessage = "10% pay bonus unlocked!" },
        [10] = { payBonus = 0.2, unlockMessage = "20% pay bonus unlocked!" },
        [15] = { payBonus = 0.3, hookSpeed = 0.8, unlockMessage = "30% pay bonus + faster hooking!" },
        [20] = { payBonus = 0.4, hookSpeed = 0.7, unlockMessage = "40% pay bonus + even faster hooking!" },
        [25] = { payBonus = 0.5, hookSpeed = 0.6, emergencyBonus = true, unlockMessage = "50% pay bonus + emergency call access!" },
        [30] = { payBonus = 0.6, hookSpeed = 0.5, emergencyBonus = true, unlockMessage = "60% pay bonus unlocked!" },
        [40] = { payBonus = 0.8, hookSpeed = 0.4, emergencyBonus = true, unlockMessage = "80% pay bonus unlocked!" },
        [50] = { payBonus = 1.0, hookSpeed = 0.3, emergencyBonus = true, unlockMessage = "Master Tow Operator! 100% pay bonus!" }
    }
}

-- Achievements System
Config.Achievements = {
    {
        id = "first_delivery",
        name = "First Delivery",
        description = "Complete your first vehicle delivery",
        condition = function(stats)
            return (stats.total_vehicles_delivered or 0) >= 1
        end,
        reward = { xp = 50, money = 500 }
    },
    {
        id = "rookie_driver",
        name = "Rookie Driver",
        description = "Deliver 10 vehicles",
        condition = function(stats)
            return (stats.total_vehicles_delivered or 0) >= 10
        end,
        reward = { xp = 100, money = 1000 }
    },
    {
        id = "experienced_operator",
        name = "Experienced Operator",
        description = "Deliver 50 vehicles",
        condition = function(stats)
            return (stats.total_vehicles_delivered or 0) >= 50
        end,
        reward = { xp = 250, money = 2500 }
    },
    {
        id = "veteran_driver",
        name = "Veteran Driver",
        description = "Deliver 100 vehicles",
        condition = function(stats)
            return (stats.total_vehicles_delivered or 0) >= 100
        end,
        reward = { xp = 400, money = 4000 }
    },
    {
        id = "route_master",
        name = "Route Master",
        description = "Complete 25 routes",
        condition = function(stats)
            return (stats.total_routes_completed or 0) >= 25
        end,
        reward = { xp = 300, money = 3000 }
    },
    {
        id = "route_expert",
        name = "Route Expert",
        description = "Complete 50 routes",
        condition = function(stats)
            return (stats.total_routes_completed or 0) >= 50
        end,
        reward = { xp = 500, money = 5000 }
    },
    {
        id = "big_earner",
        name = "Big Earner",
        description = "Earn $100,000 total",
        condition = function(stats)
            return (stats.total_earnings or 0) >= 100000
        end,
        reward = { xp = 500, money = 5000 }
    },
    {
        id = "millionaire",
        name = "Millionaire",
        description = "Earn $1,000,000 total",
        condition = function(stats)
            return (stats.total_earnings or 0) >= 1000000
        end,
        reward = { xp = 1000, money = 25000 }
    },
    {
        id = "level_master",
        name = "Level Master",
        description = "Reach level 25",
        condition = function(stats)
            return (stats.level or 1) >= 25
        end,
        reward = { xp = 1000, money = 10000 }
    },
    {
        id = "max_level",
        name = "Max Level",
        description = "Reach the maximum level (50)",
        condition = function(stats)
            return (stats.level or 1) >= 50
        end,
        reward = { xp = 2500, money = 50000 }
    },
    {
        id = "dedicated_worker",
        name = "Dedicated Worker",
        description = "Work for 100 hours total",
        condition = function(stats)
            return (stats.playtime_minutes or 0) >= 6000 -- 100 hours in minutes
        end,
        reward = { xp = 750, money = 15000 }
    },
    {
        id = "workaholic",
        name = "Workaholic",
        description = "Work for 500 hours total",
        condition = function(stats)
            return (stats.playtime_minutes or 0) >= 30000
        end,
        reward = { xp = 2000, money = 50000 }
    }
}

-- Vehicle Spawn Points
Config.VehicleSpawns = {
    {
        coords = vector4(411.2, -1631.5, 29.3, 230.0),
        model = 'flatbed'
    }
}

-- Route Configuration
Config.Routes = {
    {
        id = 1,
        name = "Downtown Route",
        startArea = vector3(200.0, -800.0, 31.0),
        radius = 800,
        difficulty = 1,
        vehicleCount = { min = 2, max = 4 },
        payMultiplier = 1.0,
        timeLimit = 30, -- minutes
        description = "Easy city route for beginners"
    },
    {
        id = 2,
        name = "Highway Route",
        startArea = vector3(-1200.0, -1500.0, 5.0),
        radius = 1200,
        difficulty = 2,
        vehicleCount = { min = 3, max = 5 },
        payMultiplier = 1.3,
        timeLimit = 45,
        description = "Medium difficulty highway patrol"
    },
    {
        id = 3,
        name = "Sandy Shores Route",
        startArea = vector3(1850.0, 3700.0, 33.0),
        radius = 1000,
        difficulty = 3,
        vehicleCount = { min = 4, max = 6 },
        payMultiplier = 1.6,
        timeLimit = 60,
        description = "Hard desert route with long distances"
    },
    {
        id = 4,
        name = "Paleto Bay Route",
        startArea = vector3(-450.0, 6020.0, 31.0),
        radius = 900,
        difficulty = 2,
        vehicleCount = { min = 2, max = 4 },
        payMultiplier = 1.4,
        timeLimit = 40,
        description = "Scenic mountain route"
    },
    {
        id = 5,
        name = "Industrial Route",
        startArea = vector3(1000.0, -3000.0, 5.0),
        radius = 1100,
        difficulty = 3,
        vehicleCount = { min = 5, max = 7 },
        payMultiplier = 1.8,
        timeLimit = 75,
        description = "Challenging industrial area"
    }
}

-- Depot Locations with Peds
Config.Depots = {
    {
        id = 1,
        name = "Central Depot",
        coords = vector3(398.9, -1619.1, 29.3),
        heading = 50.0,
        ped = {
            model = 'a_m_y_mexthug_01',
            coords = vector4(398.9, -1619.1, 29.3, 50.0),
            scenario = 'WORLD_HUMAN_CLIPBOARD'
        },
        blip = {
            sprite = 50,
            color = 2,
            scale = 0.7,
            name = "Vehicle Depot"
        }
    },
    {
        id = 2,
        name = "Sandy Shores Depot",
        coords = vector3(1728.2, 3711.1, 34.2),
        heading = 20.0,
        ped = {
            model = 'a_m_y_mexthug_01',
            coords = vector4(1728.2, 3711.1, 34.2, 20.0),
            scenario = 'WORLD_HUMAN_CLIPBOARD'
        },
        blip = {
            sprite = 50,
            color = 2,
            scale = 0.7,
            name = "Vehicle Depot"
        }
    },
    {
        id = 3,
        name = "Paleto Depot",
        coords = vector3(-475.0, 6030.0, 31.3),
        heading = 135.0,
        ped = {
            model = 'a_m_y_mexthug_01',
            coords = vector4(-475.0, 6030.0, 31.3, 135.0),
            scenario = 'WORLD_HUMAN_CLIPBOARD'
        },
        blip = {
            sprite = 50,
            color = 2,
            scale = 0.7,
            name = "Vehicle Depot"
        }
    }
}

-- Tow Truck Settings with proper offsets
Config.TowTrucks = {
    ['flatbed'] = {
        name = 'Flatbed Truck',
        hookOffset = vector3(0.0, -1.8, 0.8),
        capacity = 1
    }
}

-- Broken Vehicle Models by Difficulty
Config.BrokenVehicles = {
    [1] = { -- Easy - Small cars
        'blista', 'brioso', 'dilettante', 'issi2', 'panto', 'prairie',
        'rhapsody', 'weevil', 'club', 'kanjo'
    },
    [2] = { -- Medium - Regular cars
        'cogcabrio', 'exemplar', 'f620', 'felon', 'jackal', 'oracle',
        'oracle2', 'sentinel', 'zion', 'zion2', 'asterope', 'fugitive'
    },
    [3] = { -- Hard - Large vehicles
        'buffalo', 'vigero', 'buccaneer', 'voodoo2', 'primo', 'regina',
        'bison', 'bobcatxl', 'rumpo', 'speedo', 'youga'
    }
}

-- Payment Configuration
Config.Payments = {
    base = 400,
    distance_multiplier = 1.2,
    route_completion_bonus = 750,
    difficulty_multiplier = {
        [1] = 1.0,
        [2] = 1.5,
        [3] = 2.2
    },
    vehicle_class_bonus = {
        [0] = 50,   -- Compacts
        [1] = 75,   -- Sedans
        [2] = 100,  -- SUVs
        [8] = 80,   -- Motorcycles
        [9] = 120,  -- Off-road
        [10] = 150, -- Industrial
        [11] = 90,  -- Utility
        [12] = 110  -- Vans
    }
}

-- Items Required
Config.RequiredItems = {
    ['tow_chain'] = 1,
    ['tow_strap'] = 1,
    ['work_gloves'] = 1
}

-- Hook/Unhook Settings
Config.HookSettings = {
    hookTime = 8000,
    unhookTime = 6000,
    range = 15.0,
    emergencyUnhookTime = 3000,
    maxHookDistance = 8.0,
    minHookDistance = 2.0
}

-- Notification Settings
Config.Notifications = {
    position = 'top-right',
    duration = 5000
}

-- Animation Settings
Config.Animations = {
    hook = {
        dict = 'mini@repair',
        anim = 'fixing_a_ped'
    },
    unhook = {
        dict = 'mini@repair',
        anim = 'fixing_a_ped'
    },
    inspect = {
        dict = 'amb@medic@standing@kneel@base',
        anim = 'base'
    },
    delivery = {
        dict = 'amb@world_human_clipboard@male@idle_a',
        anim = 'idle_a'
    }
}

Framework & Inventory

Config.Framework = 'auto' -- 'esx', 'qb', or 'auto'
Config.Inventory = 'auto' -- 'ox_inventory', 'qb-inventory', or 'auto'
Config.Target = 'auto'    -- 'ox_target', 'qb-target', 'qtarget', or 'auto'

XP & Leveling System

XP scaling:

  • XP needed per level increases exponentially

  • Base: 100 XP | Multiplier: 1.5x

Level Benefits

Level
Pay Bonus
Hook Speed
Unlocks

5

10%

-

Bonus pay

15

30%

Faster

Speed bonus

25+

50%-100%

Fastest

Emergency unhook bonus

Last updated