> ## Documentation Index
> Fetch the complete documentation index at: https://docs.projectx.gg/llms.txt
> Use this file to discover all available pages before exploring further.

# Open Source

> Open source files available for customization in the K4MB1 Cash Exchange 2 Robbery resource

## opensource/client/client.lua

Each robbery step triggers the `projectx-cashexchange2robbery-k4mb1:client:Minigames` callback with the step name.

```lua theme={null}
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)
```

<Info>
  You can return `true` unconditionally inside any step block to skip that minigame entirely.
</Info>

The default minigames per step are:

| Step          | Minigame Resource | Function      |
| ------------- | ----------------- | ------------- |
| `Ventilation` | `bl_ui`           | `CircleSum`   |
| `Prop`        | `bl_ui`           | `RapidLines`  |
| `Key`         | `bl_ui`           | `CircleShake` |
| `Fusebox`     | `boii_minigames`  | `wire_cut`    |
| `Keypad`      | `bl_ui`           | `DigitDazzle` |

***

## opensource/server/server.lua

### Hooks

<AccordionGroup>
  <Accordion title="SuccessfulStep(source, step)" icon="circle-check">
    Step names are listed in `Config.CashExchangeSteps` inside `config/config.lua`.
  </Accordion>

  <Accordion title="FailedStep(source, step)" icon="circle-xmark">
    Called whenever a player fails a robbery step.
  </Accordion>

  <Accordion title="InitialCheck(Interaction)" icon="shield-check">
    Return `false` to block a player from starting the robbery.
  </Accordion>

  <Accordion title="RobberyResetHook()" icon="rotate">
    Called whenever the heist resets.
  </Accordion>
</AccordionGroup>
