Skip to main content

Requirements

  • A FiveM server already running cc_heistcontracts — Fleeca is a module that registers a contract against it.
  • ox_lib and oxmysql.
  • A working cc_lib resource.
  • An inventory system (defaults assume ox_inventory).

Steps

1

Place the resource

Copy cc_fleecaheist into a resources directory the server loads. The repo ships under resources/[cc]/cc_fleecaheist/.
2

Add the inventory items

Add the following items to ox_inventory/data/items.lua
hacking_device = { label = 'DataJack', weight = 600, stack = false },
laptop_cheap = { label = 'Refurb LiteBook', weight = 2500, stack = false },
electric_drill = { label = 'Cordless Drill', weight = 1800, stack = false },
Drop the matching item images into ox_inventory/web/images/ (filenames must match the name of the item).
The weapon_pistol requirement is a standard ox_inventory weapon — no extra config needed if you’re on the stock weapons list.
3

Configure gabz map-data

Changes need to be made in cfx-gabz-mapdata/gabz_entityset_mods1.luaReplace the gabz_fleeca0X_milo_ entries with this:
  {
      ipl = 'gabz_fleeca01_milo_',
      coords = { x = 309.74646, y = -277.644165, z = 53.2345963 },
      entitySets = {
          { name = 'room04_cashtrolley', enable = false }, -- bags and cash trolleys
          { name = 'room05_cashtrolley', enable = false }, -- bags and cash trolleys
      }
  },
  {
      ipl = 'gabz_fleeca02_milo_',
      coords = { x = 1179.74475, y = 2706.985, z = 37.15784 },
      entitySets = {
          { name = 'room04_cashtrolley', enable = false }, -- bags and cash trolleys
          { name = 'room05_cashtrolley', enable = false }, -- bags and cash trolleys
      }
  },
  {
      ipl = 'gabz_fleeca03_milo_',
      coords = { x = 145.416824, y = -1039.277, z = 28.4378834 },
      entitySets = {
          { name = 'room04_cashtrolley', enable = false }, -- bags and cash trolleys
          { name = 'room05_cashtrolley', enable = false }, -- bags and cash trolleys
      }
  },
  {
      ipl = 'gabz_fleeca04_milo_',
      coords = { x = -1216.7616, y = -333.000763, z = 36.85084 },
      entitySets = {
          { name = 'room04_cashtrolley', enable = false }, -- bags and cash trolleys
          { name = 'room05_cashtrolley', enable = false }, -- bags and cash trolleys
      }
  },
  {
      ipl = 'gabz_fleeca05_milo_',
      coords = { x = -355.435852, y = -48.5326, z = 48.1063843 },
      entitySets = {
          { name = 'room04_cashtrolley', enable = false }, -- bags and cash trolleys
          { name = 'room05_cashtrolley', enable = false }, -- bags and cash trolleys
      }
  },
  {
      ipl = 'gabz_fleeca06_milo_',
      coords = { x = -2962.59131, y = 478.238037, z = 14.7668953 },
      entitySets = {
          { name = 'room04_cashtrolley', enable = false }, -- bags and cash trolleys
          { name = 'room05_cashtrolley', enable = false }, -- bags and cash trolleys
      }
  },
4

Ensure after cc_heistcontracts

Order matters in server.cfg:
ensure oxmysql
ensure ox_lib
ensure cc_lib
ensure cc_heistcontracts
ensure cc_fleecaheist
cc_fleecaheist’s fxmanifest.lua already declares cc_heistcontracts as a dependency, so FXServer will refuse to start it before the parent is up. Wrong order = No such export RegisterContract in resource cc_heistcontracts.
5

(Optional) Register the branch doors

Set cfg.auto_insert_doors = true in shared/config.lua and the resource will insert its branch doors into the ox_doorlock table on first start (skipping any names already present). Leave it false if you manage doors manually.
6

(Optional) Tune the police gate

By default the contract refuses to start unless ≥ 2 on-duty police jobs are online. Edit shared/contract.lua:
requiredPolice = { jobs = { 'police' }, count = 2 }
Set count = 0 (or remove the field) to disable the gate for testing.
7

Verify in-game

  1. Use a heist_tablet to open the dashboard.
  2. The Fleeca Bank Heist listing should drip into the marketplace within the configured interval (3 min default).
  3. Buy it for 2,500 VICE. The slot fills.
  4. Pick a branch from the active-slot dropdown and press Start. With debug off you’ll need 2 cops online; with debug on (cfg.debug = true in shared/config.lua) the gate is bypassed.
Need it to appear instantly? Lower config.rotation.dripIntervalMs in cc_heistcontracts/shared/config.lua to 5 * 1000 and restart cc_heistcontracts.

Customising loot

shared/rewards.lua defines the global loot table — the totals that get distributed across all lockers and all trolleys when cfg.use_global_loot_table = true (the default).
return {
    lockers = {
        { type = 'item', item = 'black_money', amount = { min = 1000, max = 2000 } },
        { type = 'money',                       amount = { min = 1000, max = 2000 } },
    },
    trolleys = {
        { type = 'item', item = 'black_money', amount = { min = 1000, max = 2000 } },
        { type = 'money',                       amount = { min = 1000, max = 2000 } },
    },
}
The rolled total is split evenly across the units in that category — if black_money rolls 1,500 and there are 3 lockers, each locker contains 500. Set use_global_loot_table = false in shared/config.lua and define loot per-unit inside each branch file under shared/locations/.

Disabling a branch

Remove (or comment out) the matching entry in shared/contract.lua’s locations array. The default six branches are:
  • pinkcage — Pinkcage Branch
  • delperro — Del Perro Branch
  • greatocean — Great Ocean Hwy Branch
  • harmony — Harmony Branch
  • hawick — Hawick Branch
  • legionsquare — Legion Branch