Skip to main content
Most of the core logic in this resource is handled by the bridge. The open source files are provided so you can customize minigames, add hooks for custom systems, and extend the script without touching escrow.

opensource/client/client.lua

Each robbery step triggers the projectx-cashexchangerobbery-k4mb1:client:Minigames callback with the step name.
lib.callback.register('projectx-cashexchangerobbery-k4mb1:client:Minigames', function(Step)
    local p = promise.new()
    if Step == "Ventilation" then
        if not exports['projectx-bridge']:MinigameCheck("lightsout") then p:resolve(false) return Citizen.Await(p) end
        local success = exports["bl_ui"]:WaveMatch(1, {duration = 30000})
        p:resolve(success)
    elseif Step == "Computer" then
        if not exports['projectx-bridge']:MinigameCheck("boii_minigames") then p:resolve(false) return Citizen.Await(p) end
        exports['boii_minigames']:chip_hack({style = 'default', loading_time = 8000, chips = 2, timer = 20000}, 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"]:PrintLock(1, {grid = 5, duration = 15000, target = 5})
        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_uiWaveMatch
Propbl_uiProgress
Searchbl_uiCircleProgress
Computerboii_minigameschip_hack
Safeboii_minigamessafe_crack
Keypadbl_uiPrintLock

opensource/server/server.lua

Hooks

Called whenever a player successfully completes a robbery step. Step names are listed in Config.CashExchangeSteps inside config/config.lua.
Called whenever a player fails a robbery step.
Called before a player can start the robbery. Return false to block them.
Called whenever the heist resets.