ScriptsM JobsBundle

ScriptsM Jobs Bundle

A lot of FiveM civilian jobs still feel too simple and repetitive to keep players interested.

Jobs Bundle is built to fix that.

It replaces boring marker grind with real gameplay, mini-games, physical interaction, and job flow players actually want to do. Each job is designed to feel active, replayable, and worth doing on long-term RP servers.

Installation

Download a resource (opens in a new tab) from keymaster or buy it by buttons at the top

Resource start order

It's important for your resources to start in a logical order to prevent errors from missing dependencies.

start [your framework]
start [your target system]
start sm_jobs_bundle

Config

There you can find an config of resource with description for all params

Config = Config or {}
 
Config.Framework = 'auto' -- auto | qb | esx | standalone
Config.Locale = 'en'
Config.Debug = false
 
Config.InteractKey = 38 -- E
Config.DrawDistance = 45.0
 
Config.Target = {
  npc = {
    enabled = true,
    system = 'auto', -- auto | qb | qb-target | ox | ox_target
    icon = 'fas fa-briefcase',
    distance = 2.2,
  },
  actions = {
    enabled = false,
    system = 'auto', -- auto | qb | qb-target | ox | ox_target
    icon = 'fas fa-hand',
    distance = 2.5,
  },
}
 
Config.Sounds = {
  actionPrompt = {
    name = 'NAV_UP_DOWN',
    set = 'HUD_FRONTEND_DEFAULT_SOUNDSET',
    cooldownMs = 700,
  },
  skill = {
    success = { name = 'YES', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
    fail = { name = 'NO', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
  },
  garbage = {
    lever = { name = 'NAV_LEFT_RIGHT', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET', cooldownMs = 180 },
    lift = { name = 'PIN_BUTTON', set = 'ATM_SOUNDS', cooldownMs = 240 },
    dump = { name = 'BACK', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
  },
}
 
Config.VehicleExit = {
  returnTimeoutSeconds = 300,
}
 
Config.Payout = {
  account = 'cash',
}
 
Config.MiniGames = {
  enabled = true,
  debug = false,
 
  lever = {
    enabled = true,
    difficulty = 'normal',
    timeout = 10000,
    holdMs = 700,
    resistance = 0.16,
  },
 
  hammer = {
    enabled = true,
    difficulty = 'normal',
    timeout = 10000,
    nails = 4,
    hitsPerNail = 3,
    maxMisses = 5,
  },
 
  weld = {
    enabled = true,
    difficulty = 'normal',
    timeout = 12000,
    checkpoints = 18,
    maxStrikes = 5,
  },
 
  tire = {
    enabled = true,
    difficulty = 'normal',
    timeout = 16000,
    mode = 'repair_or_replace',
    patchHoldMs = 900,
  },
 
  jackhammer = {
    enabled = true,
    difficulty = 'normal',
    timeout = 11000,
    weakPoints = 4,
    holdPerPointMs = 700,
  },
 
  engine = {
    enabled = true,
    difficulty = 'normal',
    timeout = 14000,
    wires = 2,
    screws = 3,
  },
 
  undercar = {
    enabled = true,
    difficulty = 'normal',
    timeout = 14000,
    bolts = 3,
  },
 
  farm_plant = {
    enabled = true,
    difficulty = 'normal',
    timeout = 12000,
    coverActions = 2,
  },
 
  farm_water = {
    enabled = true,
    difficulty = 'normal',
    timeout = 12000,
    pourMs = 1100,
  },
 
  farm_fertilize = {
    enabled = true,
    difficulty = 'normal',
    timeout = 12000,
    pourMs = 1100,
  },
}
 
Config.Jobs = {
  garbage = {
    labelKey = 'job_garbage_label',
    briefingKey = 'job_garbage_briefing',
    binModelFull = 'prop_cs_bin_03',
    binModelEmpty = 'prop_cs_bin_01_skinned',
    lifter = {
      attachPoint = vector3(0.0, -5.45, 0.02),
-- more in actual resource
    },
    npc = { model = 's_m_y_garbage', coords = vector4(-321.19, -1545.77, 31.02, 268.0), scenario = 'WORLD_HUMAN_CLIPBOARD' },
    vehicle = { model = 'trash', spawn = vector4(-329.88, -1526.58, 27.53, 90.0), returnTo = vector3(-329.88, -1526.58, 27.53) },
    route = {
      vector3(1148.94140625, -1016.8170166016, 44.381954193115),
-- more in actual resource
    },
    bagsPerRun = { min = 6, max = 9 },
    payout = { base = 250, perBag = { min = 45, max = 75 }, completionBonus = { min = 120, max = 220 } },
  },
 
  courier = {
    labelKey = 'job_courier_label',
    briefingKey = 'job_courier_briefing',
    npc = { model = 's_m_m_postal_01', coords = vector4(78.92, 111.84, 81.17, 160.0), scenario = 'WORLD_HUMAN_CLIPBOARD' },
    vehicle = { model = 'faggio', spawn = vector4(72.86, 121.25, 79.14, 160.0), returnTo = vector3(72.86, 121.25, 79.14) },
    pickup = vector3(75.85, 120.76, 79.2),
    deliveryModels = { 'a_m_y_business_01', 'a_f_y_business_02', 'a_m_y_genstreet_01', 'a_f_y_tourist_01' },
    bag = {
      enabled = true,
      mode = 'component',
      propModel = 'prop_cs_heist_bag_02',
      component = {
        male = { component = 5, drawable = 45, texture = 0, palette = 0 },
        female = { component = 5, drawable = 45, texture = 0, palette = 0 },
      },
    },
    parcels = {
      models = { 'hei_prop_heist_box', 'prop_cs_cardbox_01', 'prop_cs_package_01', 'prop_cash_envelope_01' },
    },
    dropoffs = {
      leaveAtAddress = {
        vector3(106.63798522949, 53.408397674561, 77.768211364746),
-- more in actual resource
      },
      handToCustomer = {
        vector4(1057.3100585938, -447.89120483398, 66.257476806641, 165.0),
-- more in actual resource
      },
    },
    deliveriesPerRun = { min = 4, max = 7 },
    payout = { base = 220, perDelivery = { min = 60, max = 110 } },
  },
 
  tow = {
    labelKey = 'job_tow_label',
    briefingKey = 'job_tow_briefing',
    npc = { model = 's_m_y_xmech_02', coords = vector4(409.39, -1623.92, 29.29, 230.0), scenario = 'WORLD_HUMAN_CLIPBOARD' },
    vehicle = { model = 'towtruck', spawn = vector4(401.67, -1631.78, 29.29, 50.0), returnTo = vector3(401.67, -1631.78, 29.29) },
    targets = {
      vector4(1432.1857910156, -2593.8037109375, 48.07356262207, 344.67227172852),
-- more in actual resource
    },
    jobsPerRun = { min = 2, max = 4 },
    impound = vector3(409.39, -1638.80, 29.29),
    payout = { base = 260, perTow = { min = 180, max = 260 } },
  },
 
  taxi = {
    labelKey = 'job_taxi_label',
    briefingKey = 'job_taxi_briefing',
    npc = { model = 's_m_m_gentransport', coords = vector4(903.89, -172.44, 74.07, 240.0), scenario = 'WORLD_HUMAN_CLIPBOARD' },
    vehicle = {
      models = {
        -- Optional per-entry override: { model = 'taxi', maxPassengers = 3 }
        { model = 'taxi' },
        { model = 'asea' },
        { model = 'primo2' },
        { model = 'tailgater' },
      },
      spawn = vector4(909.67, -170.02, 74.16, 60.0),
      returnTo = vector3(909.67, -170.02, 74.16),
    },
    maxFarePassengers = 4,
    personas = {
      -- Each persona can define request, clipset, tip range, and its own model pool.
      rushed = {
        request = 'faster',
        clipset = 'move_m@hurry@a',
        tipMin = 35,
        tipMax = 70,
        models = { 'a_m_y_business_02', -- more in actual resource },
      },
      tourist = {
        request = 'radio',
        clipset = 'move_m@casual@a',
        tipMin = 30,
        tipMax = 65,
        models = { 'a_f_y_tourist_01', -- more in actual resource },
      },
      drunk = {
        request = 'slower',
        clipset = 'move_m@drunk@moderatedrunk',
        tipMin = 25,
        tipMax = 60,
        models = { 'a_m_y_hipster_02', -- more in actual resource },
      },
      vip = {
        request = 'change_destination',
        clipset = 'move_f@heels@c',
        tipMin = 45,
        tipMax = 95,
        models = { 'a_f_y_business_02', -- more in actual resource },
      },
      ['local'] = {
        request = 'none',
        clipset = 'move_m@business@a',
        tipMin = 20,
        tipMax = 50,
        models = { 'a_m_y_genstreet_01', -- more in actual resource },
      },
    },
    pickups = {
      vector3(-2112.3784179688, -351.04067993164, 13.032479286194),
-- more in actual resource
    },
    dropoffs = {
      vector3(-1032.685546875, -2731.5727539062, 20.042793273926),
-- more in actual resource
    },
    faresPerRun = { min = 2, max = 4 },
    payout = { base = 200, perFare = { min = 140, max = 220 } },
  },
 
  construction = {
    labelKey = 'job_construction_label',
    briefingKey = 'job_construction_briefing',
    npc = { model = 's_m_y_construct_01', coords = vector4(-509.56, -1001.64, 23.55, 90.0), scenario = 'WORLD_HUMAN_CLIPBOARD' },
    workSpots = {
      jackhammer = {
        vector3(-449.7, -1002.44, 24.59),
        vector3(-448.14, -1004.96, 24.54),
      },
      hammer = {
        vector3(-465.89, -998.63, 23.69),
        vector3(-449.05, -999.14, 23.96),
      },
      welding = {
        vector3(-460.37, -1008.74, 23.79),
        vector3(-449.62, -1008.55, 23.96),
      },
      cementPickup = {
        vector3(-492.28, -994.14, 29.13),
        vector3(-498.07, -1010.45, 29.13),
      },
      cementDrop = {
        vector3(-496.87, -992.36, 29.13),
        vector3(-491.95, -1046.46, 29.13),
      },
    },
    tasksPerRun = { min = 3, max = 5 },
    payout = { perTask = { min = 95, max = 150 } },
  },
 
  roadside = {
    labelKey = 'job_roadside_label',
    briefingKey = 'job_roadside_briefing',
    npc = { model = 's_m_m_autoshop_02', coords = vector4(489.32, -1314.45, 29.25, 290.0), scenario = 'WORLD_HUMAN_CLIPBOARD' },
    vehicle = { model = 'bison2', spawn = vector4(495.4, -1330.4, 29.33, 5.65), returnTo = vector3(497.67, -1317.97, 29.25) },
    calls = {
      vector4(1432.1857910156, -2593.8037109375, 48.07356262207, 344.67227172852),
-- more in actual resource
    },
    callsPerRun = { min = 2, max = 3 },
    payout = { base = 240, perCall = { min = 160, max = 240 } },
  },
 
  farming = {
    labelKey = 'job_farming_label',
    briefingKey = 'job_farming_briefing',
    npc = { model = 'a_m_m_farmer_01', coords = vector4(1929.7708740234, 4635.2373046875, 40.460483551025, 359.86), scenario = 'WORLD_HUMAN_CLIPBOARD' },
    fields = {
      vector3(1907.2757568359, 4747.1586914062, 42.062686920166),
-- more in actual resource
    },
    harvestPerRun = { min = 8, max = 12 },
    plantModels = {
      -- Customer-friendly plant model overrides.
      sapling = { 'prop_peyote_lowland_01' },
      grown = { 'prop_plant_fern_02a', 'prop_plant_fern_02b' },
    },
    drop = vector3(1954.3514404297, 4649.0219726562, 40.727638244629),
    payout = { base = 240, perCrate = { min = 45, max = 75 } },
  },
}
 
Config.Outfits = {
  garbage = {
    male = {
      { component = 11, drawable = 56, texture = 0 },
      { component = 8, drawable = 15, texture = 0 },
-- more in actual resource
}
 
Config.VehicleExit.ignoreStepKinds = {
  'taxi_pickup',
  'taxi_dropoff',
-- more in actual resource
}