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_bundleConfig
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
}