Skip to main content

Requirements

  • A FiveM server already running cc_heistcontracts.
  • ox_lib and oxmysql.
  • A working cc_lib resource.
  • An inventory system (defaults assume ox_inventory).

Steps

1

Place the resource

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

Add the inventory items

Add the following items to ox_inventory/data/items.lua
hacking_device = { label = 'DataJack', weight = 600, stack = false },
laptop_pro = { label = 'Jackbox Pro', weight = 2800, stack = false },
frequency_tuner = { label = 'Signal Modulator', weight = 250 },
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_smg 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_paletobank_milo_ entry with this:
  {
      ipl = 'gabz_paletobank_milo_',
      coords = { x = -106.037, y = 6467.548, z = 32.169 },
      entitySets = {
          { name = 'palbank_vault_trolleys', enable = false }, -- gold and cash trolleys (cc_paletoheist spawns its own)
      }
  },
The palbank_vault_trolleys entry must be disabled — cc_paletoheist spawns its own trolley props during the run and the gabz set would duplicate them.
4

Ensure after cc_heistcontracts

Order in server.cfg:
ensure oxmysql
ensure ox_lib
ensure cc_lib
ensure cc_heistcontracts
ensure cc_paletoheist
cc_paletoheist’s fxmanifest.lua already declares cc_heistcontracts as a dependency, so FXServer enforces this.
5

(Optional) Tune the vault timer

Default vault open delay is 60 seconds. Edit shared/config.lua:
cfg.vault_timer = 60   -- seconds
Set it lower for testing, higher for harder runs.
6

Doors integration

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

Verify in-game

  1. Set a profile to level 3 (the contract is gated) — use /heist:grantxp <playerId> 500 if you’ve enabled the admin command.
  2. Open the dashboard via the heist_tablet. Paleto Bank Heist should drip into the marketplace.
  3. Buy it for 2,500 VICE, start the slot, drive to Paleto.
Want the listing instantly? Lower config.rotation.dripIntervalMs in cc_heistcontracts/shared/config.lua.

Customising loot

shared/rewards.lua defines the global loot table. When cfg.use_global_loot_table = true (default), the rolled totals are split evenly across all lockers and all trolleys.
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 } },
    },
}
Set use_global_loot_table = false to define loot per-unit inside shared/location.lua (each locker and each trolley accepts its own rewards table).