đConfigurables
In this page, you can see everything that can be configured/changed within this script.
All of the code from frameworks, inventories & such are not displayed in here. This code is triggered within the fmLib dependency script. All of the dependencies code are also opensourced within fmLib.
Config
--[[
BY CrimeM Š crimem.com
--]]
Config = {}
Config.DiscordWebhook = ''
Config.Locale = 'en'
Config.Cooldown = 60 * 60 * 1 -- 1 hour (in seconds)
Config.HelpTexts = true -- Enable help texts for the heist
Config.CrewAmount = { min = 2, max = 3 } -- Minimum and maximum amount of players required to start the heist
Config.MinimumCops = { -- Minimum amount of cops required to start the heist
jobs = { 'police', },
amount = 1,
}
Config.HeistPreparation = {
boatStealing = {
respawnTime = 1, -- Respawns after getting stolen (in minutes)
models = { 'seashark', 'seashark2', 'seashark3' }, -- Takes a random model from the list
locations = {
spawn = { -- Locations where the boats spawn
vector4(2343.0220, -2141.5647, 0.0769, 194.6900),
vector4(-1084.3320, -1192.2074, -0.9214, 212.1871),
vector4(-1603.1394, 5259.9219, 0.0789, 23.8448),
vector4(3849.6780, 4445.4976, -0.5621, 279.5180),
},
dropOffs = { -- Locations where the boats need to be dropped off
vector3(440.2832, -3119.1309, 2.0710),
vector3(626.4734, -3035.5112, 1.5238),
vector3(611.8217, -3251.2383, 1.1722),
vector3(624.4265, -3199.0117, 1.4485),
}
},
spawnBlip = {
enabled = true,
sprite = 471,
color = 1,
scale = 0.8,
display = 4,
label = 'Jetski Theft',
shortrange = true,
},
dropOffBlip = {
enabled = true,
sprite = 471,
color = 1,
scale = 0.8,
display = 4,
label = 'Jetski Dropoff',
shortrange = true,
},
}
}
Config.StartHeist = {
ped = {
enabled = true,
model = 'a_m_m_og_boss_01',
coords = vector3(575.4037, -3126.7856, 17.7686),
heading = 66.7465,
},
requiredItems = { -- Required items to start the heist
leader = { -- Leader (first player to join) required items
{ item = 'WEAPON_ASSAULTRIFLE', label = 'Assault Rifle', amount = 1 },
},
member = { -- Member (all other players) required items
{ item = 'WEAPON_ASSAULTRIFLE', label = 'Assault Rifle', amount = 1 },
},
},
lobbyLocations = { -- Locations where the players will be standing in the lobby, put the same amount of locations as Config.CrewAmount.max
vector3(567.5532, -3123.0688, 6.0693),
vector3(567.0734, -3125.3127, 6.0693),
vector3(564.8966, -3122.0139, 6.0693),
vector3(565.5909, -3120.2781, 6.0693),
},
lobbyCam = vector3(573.0823, -3123.1108, 6.0693),
startLocations = { -- Locations where the players will spawn after the heist has started, put the same amount of locations as Config.CrewAmount.max
vector4(576.4085, -3154.8389, -0.1208, 180.0879),
vector4(570.7471, -3155.1731, -0.3422, 176.7435),
vector4(564.7963, -3155.4336, -0.5895, 179.3561),
vector4(560.8832, -3157.8340, -0.5665, 175.7477),
},
startCam = vector3(569.9664, -3183.5269, 15.8752),
}
Config.GuardBoats = { -- Enemy guard boats that will follow the crew and attack them
models = { 'dinghy', 'dinghy4', 'dinghy2', 'dinghy3' }, -- Random model from the list
npcModel = 's_m_y_swat_01',
weapons = { 'WEAPON_PISTOL', 'WEAPON_ASSAULTRIFLE', 'WEAPON_MINISMG', 'WEAPON_MICROSMG' },
locations = {
vector4(521.9182, -3303.4929, -0.3846, 200.8650),
vector4(525.0930, -3256.4678, -0.1075, 187.9241),
vector4(542.4539, -3296.6021, -0.3105, 184.3543),
vector4(614.4913, -3281.8323, 0.3749, 162.1102),
},
}
Config.Heist = {
helicopter = {
model = 'supervolito2',
coords = vector4(-2043.6948, -1031.5648, 11.9807, 68.5124),
hackCoords = vector4(-2044.0222, -1030.0996, 12.2196, 159.9544),
cam = vector3(-2046.6932, -1026.4086, 15.6620)
},
hostage = {
model = 'ig_bestmen',
coords = vector4(-2089.4758, -1016.3489, 12.7812, 70.9204),
},
guards = { -- Guards on the yacht
armor = 100,
accuracy = 50,
models = { 's_m_y_westsec_01', 's_m_m_movprem_01', 's_m_y_clubbar_01' }, -- Random model from the list
weapons = { 'WEAPON_PISTOL', 'WEAPON_ASSAULTRIFLE', 'WEAPON_MINISMG', 'WEAPON_MICROSMG' }, -- Random weapon from the list
locations = { -- Locations where the guards will spawn (make sure they are all withing ~300m distance from eachother)
vector4(-2034.8484, -1033.8346, 1.5845, 248.9234),
vector4(-2018.5040, -1038.3085, 1.4458, 181.0101),
vector4(-2031.4644, -1040.0552, 4.8821, 205.5957),
vector4(-2030.2361, -1032.6637, 4.8834, 314.0041),
vector4(-2046.1937, -1024.8561, 10.9076, 346.5115),
vector4(-2048.1426, -1033.4738, 10.9325, 167.9016),
vector4(-2069.5137, -1023.7502, 10.9092, 295.5168),
vector4(-2039.4360, -1034.4673, 7.9715, 280.0163),
vector4(-2108.3062, -1008.4249, 7.9550, 72.9227),
vector4(-2102.0000, -1016.0602, 7.9706, 229.0549),
vector4(-2080.9651, -1019.4440, 7.9711, 255.1221),
vector4(-2069.5542, -1030.4613, 7.9715, 228.9160),
},
},
chasingHelicopter = {
models = { 'buzzard2', 'frogger', }, -- Random model from the list
npcModels = { 's_m_y_westsec_01', 's_m_m_movprem_01', 's_m_y_clubbar_01' }, -- Random model from the list
weapons = { 'WEAPON_PISTOL', 'WEAPON_ASSAULTRIFLE', 'WEAPON_MINISMG', 'WEAPON_MICROSMG' }, -- Random weapon from the list
locations = { -- Locations where the helicopters will spawn, 1 location is 1 helicopter
vector4(-2282.7363, -974.4718, 18.8581, 258.7421),
vector4(-2265.4331, -919.5026, 18.8581, 244.9232),
},
wait = 5, -- Seconds to wait before the helicopter spawns after putting the hostage in the helicopter
},
}
Config.EndHeist = {
rewards = {
money = {
enabled = true,
type = 'bank',
min = 1000000,
max = 2500000,
},
items = { -- Items that will be given to the trader, empty array = no items
{ item = 'WEAPON_PISTOL', min = 1, max = 3},
},
xp = {
onSuccess = 100, -- XP given to the player when the heist is successful
onFail = 10, -- XP given to the player when the heist is failed
}
},
trade = {
coords = vector3(4890.5474, -5736.8584, 26.3509),
boss = {
model = 'g_m_m_armboss_01',
vehicle = 'insurgent2',
weapon = 'WEAPON_HEAVYPISTOL',
spawn = vector4(4972.9277, -5702.8862, 19.8869, 39.6699),
to = vector4(4900.1689, -5756.9478, 26.0665, 152.0892),
standsAt = vector4(4896.2563, -5750.4570, 26.3535, 25.6154),
},
crew = {
vehicleModels = { 'technical2', 'technical3', 'technical' }, -- Random model from the list
npcModels = { 'g_m_y_mexgoon_03', 'g_m_y_salvaboss_01', 'g_m_y_mexgoon_02' }, -- Random model from the list
weapons = { 'WEAPON_ASSAULTRIFLE', }, -- Random weapon from the list
vehicles = { -- Every vehicle will be 1 vehicle filled with crew npcs
{
spawn = vector4(4951.9341, -5762.6724, 20.7571, 190.9417),
to = vector4(4872.7012, -5741.3384, 27.0391, 37.1306),
},
{
spawn = vector4(4948.9976, -5747.4863, 20.1648, 189.8807),
to = vector4(4880.7197, -5750.7451, 26.6374, 50.9486),
},
{
spawn = vector4(4969.3188, -5696.0322, 19.8947, 43.8075),
to = vector4(4910.4893, -5736.6089, 25.3784, 175.4016),
},
},
}
}
}
Config.CopsNotifications = {
jobs = { 'police', },
onBoatHackFailed = 'A jetski was attempted to be stolen, check GPS for last location!', -- put to false to disable (onBoatHackFailed = false,)
onBoatHack = 'A jetski has been stolen, check GPS for last location!', -- put to false to disable (onBoatHack = false,)
onBoatDropOff = 'A stolen jetski has been seen, check GPS for last location!', -- put to false to disable (onBoatDropOff = false,)
onHeistStart = 'A heist has been started, check GPS for last location!', -- put to false to disable (onHeistStart = false,)
onHelicopterHack = 'A helicopter has been hacked, check GPS for last location!', -- put to false to disable (onHelicopterHack = false,)
}
Config.Levels = {
[1] = {
xp = 0,
label = 'Rookie',
},
[2] = {
xp = 1000,
label = 'Runner',
},
[3] = {
xp = 2500,
label = 'Planner',
},
[4] = {
xp = 5000,
label = 'Caller',
},
[5] = {
xp = 10000,
label = 'Heister Meister',
},
}
--[[
ONLY CHANGE THIS PART IF YOU HAVE RENAMED SCRIPTS SUCH AS FRAMEWORK, TARGET, INVENTORY ETC
RENAME THE SCRIPT NAME TO THE NEW NAME
--]]
---@type table Only change these if you have changed the name of a resource
Dependencies = {
FM = { name = 'fmLib', export = 'new' },
OXTarget = 'ox_target',
QBTarget = 'qb-target',
}
IgnoreScriptFoundLogs = false
--[[
DO NOT TOUCH IF YOU HAVE NO CLUE WHAT IT IS
--]]
DefaultRoutingBucket = 0
LobbyRoutingBucket = 1
Opensource Code
--[[
BY CrimeM Š crimem.com
--]]
function InitLobbyNPCTarget(ped)
if OXTarget then
OXTarget:addLocalEntity(ped, {
{
label = 'Talk with Jerry',
icon = 'fas fa-user',
distance = 2.5,
canInteract = function()
return GlobalState[State.HEISTSTATUS] == Status.SETUP
end,
onSelect = function()
RequestJoinCrew()
end
}
})
end
end
function InitBoatStealTarget(netId)
local b = PrepBoats[netId]
if OXTarget then
OXTarget:addLocalEntity(b.veh, {
{
label = 'Hijack Jetski',
icon = 'fas fa-ship',
distance = 4,
canInteract = function()
if not b or not b.veh or b.hacked then return false end
return true
end,
onSelect = function()
HackBoat(netId)
end
}
})
end
end
-- must return true or false
function HackBoatMinigame()
-- return true
local p = promise.new()
TriggerEvent("utk_fingerprint:Start", 2, 4, 2, function(outcome, reason)
if outcome == true then -- reason will be nil if outcome is true
p:resolve(true)
elseif outcome == false then
p:resolve(false)
end
end)
return Citizen.Await(p)
end
-- must return true or false
function HackHeliMinigame()
-- return true
local res = promise.new()
TriggerEvent('ultra-keypadhack', 6, 120, function(outcome, reason)
if outcome == 1 then
res:resolve(true)
else
res:resolve(false)
end
end)
return Citizen.Await(res)
end
---@param type 'dropoff'
function ShowMarker(type, coords)
if type == 'dropoff' then
DrawMarker(35, coords, 0, 0, 0, 0, 0, 0, 3.0, 3.0, 3.0, 255, 100, 100, 100, false, true, 2, false, false, false, false)
end
end
RegisterNetEvent(_E('notifyCops'), function(coords, msg)
local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
SetBlipSprite(blip, 161)
SetBlipScale(blip, 1.0)
SetBlipColour(blip, 1)
SetBlipAsShortRange(blip, false)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString('Suspicious activity')
EndTextCommandSetBlipName(blip)
FM.utils.notify(msg, 'error')
Wait(20000)
RemoveBlip(blip)
end)
function ShowOpenHeliDialog()
local result = FM.dialog.open({
title = 'Darshan',
message = 'Ii.. do.. not hh..ave.. tthe.. keyss..! Mmyy p..pilot has tth..them..',
confirmLabel = 'F* You! We hackin this shit',
canCancel = false,
useSfx = false,
size = 'lg',
})
if result and result == 'confirm' then
HackHelicopter()
end
end
function RequestJoinCrew()
local result = FM.dialog.open({
title = 'Jerry',
message = 'Sup bro, you ready to start the heist?',
confirmLabel = 'Count me in!',
size = 'lg'
})
if result and result == 'confirm' then JoinCrew() end
end
--[[
BY CrimeM Š crimem.com
--]]
--[[
These events can be used to integrate other scripts etc.
If you register these events in other scripts make sure to change GetCurrentResourceName() to the name of this script.
Example: GetCurrentResourceName()..':onCrewJoined' -> 'cm_yachtheist:onCrewJoined'
--]]
RegisterNetEvent(GetCurrentResourceName()..':onCrewJoined', function(playerId, newCrew)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onCrewExit', function(playerId, newCrew)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onPrepBoatDelivered', function(playerId, boat)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onPrepBoatHacked', function(playerId, boat)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onHeistStarted', function(crew)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onHeistEnded', function(success, reason, crew)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onXPGained', function(playerId, amount, reason)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onXPGained', function(playerId, amount, reason)
-- Code here
end)
RegisterNetEvent(GetCurrentResourceName()..':onXPRemoved', function(playerId, amount)
-- Code here
end)
Last updated