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).
  • Streaming enabled on the server — the resource ships custom jammer assets.

Steps

1

Place the resource

Copy cc_pacificheist into a resources directory the server loads. The repo ships under resources/[cc]/cc_pacificheist/. The stream/ folder must travel with it — the custom jammer props live there.
2

Add the inventory items

Add the following items to ox_inventory/data/items.lua
laptop_elite = { label = 'BlackBook Mk-III', weight = 3200, stack = false },
signal_jammer = { label = 'Signal Jammer', weight = 400 },
thermite = { label = 'Thermite Charge', weight = 800 },
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_digiscanner and weapon_assaultrifle requirements are standard ox_inventory weapons — no extra config needed if you’re on the stock weapons list.
In the shipped Qbox items.lua the thermite entry exists but is commented out at line ~830. Uncomment it before launching this heist.
3

Configure gabz map-data

Changes need to be made in cfx-gabz-mapdata/gabz_entityset_mods1.luaReplace the gabz_sm_pb_milo entry with this:
  {
      ipl = 'gabz_sm_pb_milo',
      coords = { x = 260.01200000, y = 220.73300000, z = 108.64600000 },
      entitySets = {
          { name = 'room01_entrance', enable = true },
          { name = 'room02_mainhall', enable = true },
          { name = 'room03_sideentrance', enable = true },
          { name = 'room04_roofstairs', enable = true },
          { name = 'room05_office01', enable = true },
          { name = 'room06_office02', enable = true },
          { name = 'room07_office03', enable = true },
          { name = 'room08_office04', enable = true },
          { name = 'room09_office05', enable = true },
          { name = 'room10_office06', enable = true },
          { name = 'room11_office07', enable = true },
          { name = 'room12_office08', enable = true },
          { name = 'room13_mainoffice', enable = true },
          { name = 'room14_vaultstairs', enable = true },
          { name = 'room15_vaultbasement', enable = true },
          { name = 'room16_vault', enable = true },
          { name = 'room16_vault_trolleys', enable = false }, -- cash trolleys (cc_pacificheist spawns its own)
      }
  },
The room16_vault_trolleys entry must be disabled — cc_pacificheist 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_pacificheist
cc_pacificheist’s fxmanifest.lua already declares cc_heistcontracts as a dependency.
5

Verify the jammer assets are streaming

The custom jammer props require the data_file 'DLC_ITYP_REQUEST' 'stream/cc_jammer.ytyp' line in fxmanifest.lua (already present). On first boot, watch the server console for:
Streaming pacificheist resource 'cc_jammer.ytyp'
No error = good. If clients see invisible jammers, the .ytyp isn’t being read — check that this_is_a_map 'yes' is still in fxmanifest.lua.
6

(Optional) Tune the jammer difficulty

shared/config.lua:
cfg.jammer = {
    drainSeconds = 90,    -- 100% → 0% takes this many seconds with no maintain
    bumpAmount   = 40,    -- +% on a successful maintain
    beepWarn     = 40,    -- start slow beep when signal ≤ this %
    beepCritical = 20,    -- switch to fast beep when signal ≤ this %
}
cfg.maintain_timer = 5 * 60   -- maintain cooldown per jammer (seconds)
Raise drainSeconds for a more forgiving fight; drop bumpAmount to make maintain runs more critical.
7

Register the bank doors

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

(Optional) Disable the bank manager

By default a manager ped (IG_Avery) spawns at his PC armed with a pistol and shoots the crew. Set cfg.enable_manager = false in shared/config.lua to skip him.
9

Verify in-game

  1. Grant a profile level 5 (/heist:grantxp <playerId> 1500 reaches level 5 on the default curve).
  2. Open the dashboard via the heist_tablet. Pacific Bank Heist drips into the marketplace at weight 0.2 — it’s rare. Lower config.rotation.dripIntervalMs or temporarily bump the contract weight to 1.0 in shared/contract.lua to test.
  3. Buy it for 2,500 VICE, gather the items, drive to downtown.
With cfg.debug = true plus the manager disabled, you can solo the contract to verify task progression without fighting the cops dispatched on vault_panel.

Customising loot

shared/rewards.lua is the global loot table. When cfg.use_global_loot_table = true (default), totals are split 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 } },
    },
}
The Pacific heist has three loot rooms (left, right, inside), each containing lockers and trolleys. The global table applies the rolled totals across every locker across every room, and similarly for trolleys. For per-room control, set use_global_loot_table = false and define rewards tables on each unit in shared/location.lua.