Skip to main content

opensource/client/client.lua

Each robbery step triggers the projectx-cashexchange2robbery-k4mb1:client:Minigames callback with the step name.
lib.callback.register('projectx-cashexchange2robbery-k4mb1:client:Minigames', function(Step)
    local p = promise.new()
    if Step == "Ventilation" then
        if not exports['projectx-bridge']:MinigameCheck("bl_ui") then p:resolve(false) return Citizen.Await(p) end
        local success = exports["bl_ui"]:CircleSum(3, {length = 4, duration = 15000})
        p:resolve(success)
    elseif Step == "Fusebox" then
        if not exports['projectx-bridge']:MinigameCheck("boii_minigames") then p:resolve(false) return Citizen.Await(p) end
        exports['boii_minigames']:wire_cut({style = 'default', timer = 60000}, function(success)
            p:resolve(success)
        end)
    elseif Step == "Keypad" then
        if not exports['projectx-bridge']:MinigameCheck("bl_ui") then p:resolve(false) return Citizen.Await(p) end
        local success = exports["bl_ui"]:DigitDazzle(1, {length = 4, duration = 20000})
        p:resolve(success)
    end
    return Citizen.Await(p)
end)
You can return true unconditionally inside any step block to skip that minigame entirely.
The default minigames per step are:
StepMinigame ResourceFunction
Ventilationbl_uiCircleSum
Propbl_uiRapidLines
Keybl_uiCircleShake
Fuseboxboii_minigameswire_cut
Keypadbl_uiDigitDazzle

opensource/server/server.lua

Hooks

Step names are listed in Config.CashExchangeSteps inside config/config.lua.
Called whenever a player fails a robbery step.
Return false to block a player from starting the robbery.
Called whenever the heist resets.