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
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:
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:
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:
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.
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).