📝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

Last updated