Impound Heist Installation

•7 min read

Impound Heist Installation

This guide gets vs-impound-heist running from a clean download. Follow the steps in order. The most common failure is starting the heist before the Impound Job it depends on.

Keep the folder named vs-impound-heist. The two usable items call resource-scoped exports (vs-impound-heist.camera and vs-impound-heist.signalbox), and the Impound Job's Creator finds the heist by that exact name. Keep vs-impoundjob under its own name too, because the heist asks for it by name. Renaming either folder breaks the link between them.

Requirements

  • A licensed FiveM server on a recent artifact.
  • The WXMAPS Impound Job (vs-impoundjob), installed and working, with at least one yard built in its Creator. The heist has no yards of its own.
  • A framework core: Qbox, QBCore or ESX. It is used to pay the crew and charge for the supplier's goods.
  • The resources on the Dependencies page.
  • A MySQL database reachable through oxmysql.

Step 1: Install the dependencies first

Install and confirm these are working before the heist. See Dependencies for what each one does.

  • ox_lib, oxmysql, ox_target, ox_inventory
  • vs-npc-dialogue and vs-minigames (free companion resources)
  • vs-impoundjob (the Impound Job)

Step 2: Download and upload the heist

  1. Log in to the Cfx.re portal with the Cfx account you purchased with.
  2. Open Granted Assets and download vs-impound-heist. It is granted with your Impound Job Script purchase, next to vs-impoundjob.
  3. Extract the .zip and upload the whole vs-impound-heist folder into your resources/ directory. A sub-folder such as resources/[wxmaps] is fine. Do not rename it.

New to Cfx.re downloads? The General Installation Guide walks through the portal step by step.

Step 3: Order server.cfg correctly

Every dependency must start before the heist, and vs-impoundjob must start directly before it. The resource declares all seven dependencies in its manifest, so the server refuses to start it if any of them is missing.

# ── your framework core first ─────────────
ensure qbx_core            # or qb-core / es_extended

# ── libraries ─────────────────────────────
ensure ox_lib
ensure oxmysql

# ── target + inventory ────────────────────
ensure ox_target
ensure ox_inventory

# ── free companion resources ──────────────
ensure vs-npc-dialogue
ensure vs-minigames

# ── optional: the WXMAPS impound map ──────
ensure wxmaps_commons
ensure wxmaps_lsimpound

# ── the Impound Job, then the heist ───────
ensure vs-impoundjob
ensure vs-impound-heist

Start your framework core before the heist. If the core starts later, the heist notices and prints Framework resolved late in the console, but a server that never starts a supported core gets a crew that delivers a car and is paid nothing.

Step 4: Database

There is nothing to import. The heist owns one table, vs_heist_reputation, and creates it automatically on first start with CREATE TABLE IF NOT EXISTS. It is the same table, with the same schema, that the Laundromat Heist uses, so if you already run that script the table is already there.

If you prefer to provision it yourself, this is the exact statement the script runs:

CREATE TABLE IF NOT EXISTS `vs_heist_reputation` (
    `citizenid` VARCHAR(64) NOT NULL,
    `clan` VARCHAR(64) NOT NULL,
    `rep` INT NOT NULL DEFAULT 0,
    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`citizenid`, `clan`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Everything you set up in the Creator's HEIST panel is stored in the resource's own key-value store (KVP) on the server, not in MySQL. Yard cooldowns are kept in memory.

If the database is unavailable, the heist still runs. Nobody earns standing (everyone stays a Stranger), the console says so once, and the fixer's standing panel tells players their progress is not being remembered.

Step 5: Register the items

The heist needs two ox_inventory items: the signal box (signalbox) that opens the gates, and its own microcamera (microcamera_impound). Both are usable items wired to the heist's exports. Copy the block from the Items page into ox_inventory/data/items.lua, and add an image for each.

At boot the heist checks that every item in Config.Items exists in ox_inventory and prints a warning for each one that does not. Without the items, a contract can never get past preparation.

Step 6: Configure the essentials

Open config/config.lua (left editable via escrow_ignore). Most of what is in it can also be set in game from the Creator, which is the easier route for anything that is a position in the world. At minimum, sort out these:

  • The buyers. The three drop-offs in Config.Dropoffs are placeholders. Place your own in the Creator (HEIST, Drop-offs tab) or capture coordinates and write them in.
  • The supplier. Config.Shop.coords ships empty, so nobody sells a signal box until you place him (HEIST, Supplier tab). Without him the crew has no way to get the box unless you sell signalbox somewhere else.
  • The fixer. He ships at a fixed spot in Config.Fixer.coords. Move him in the Creator (HEIST, Contract tab) if you want him elsewhere.
  • Your police job names. Config.PoliceAlert.jobs (who gets the silent alarm) and Config.MinPolice.jobs (who counts towards the optional minimum). Both default to police, sheriff and bcso.

The full annotated reference is on the Configuration page.

Step 7: First-time setup in the Creator

Open the Impound Job's Creator with /impoundcreator (it uses the Impound Job's own admin gate) and click the HEIST button at the top right. The button only appears while vs-impound-heist is running.

  1. Contract tab: place the fixer, or check where he stands.
  2. Supplier tab: place the supplier (and his van) and check his list.
  3. Drop-offs tab: replace the placeholder buyers with your own.
  4. Yard tab: pick each lot on the left and clear anything listed under "The fixer will not name this yard". Choose which safe is cracked and place a few post-its for the code.

Every yard also has a "This yard can be robbed" switch on its own Setup tab. It is on by default. The full walkthrough is on Setup in the Creator, and building the yards themselves is covered in the Impound Job's Creator guide.

Step 8: Go live

Before opening to players:

Config.Debug = false   -- internal trace in the console; ships false

Also decide whether the fixer should have a map blip (Config.Fixer.blip.enabled, on as shipped, or "Map marker" in the Creator) and whether to require police on duty (Config.MinPolice.enabled, off as shipped).

Anti-cheat & model whitelist

The heist spawns peds, vehicles and props. If your anti-cheat blocks entity creation, whitelist these defaults (and any models you change them to):

TypeModels
Pedsg_m_m_armboss_01 (fixer), s_m_y_dealer_01 (supplier), s_m_y_dockwork_01 (buyers), a_m_m_business_01 (fallback if a configured ped model will not load)
Vehiclessultan, buffalo2, comet2, elegy2, schafter3 (the cars in the yard), speedo (the supplier's van)
Propsxs_prop_arena_stickynote_01a (the post-it), prop_npc_phone_02 (the camera phone), ba_prop_battle_chest_closed (the supplier's seat), prop_cs_walkie_talkie and prop_cs_cardbox_01 (shop previews)

The cars in the yard are networked vehicles created by a crew member's client, and the buyer who drives the car away is a networked ped created by the client of the player who handed it over. A server running sv_entityLockdown strict, or an anti-cheat that blocks client-created networked entities, will never see the yard fill up. Allow script-created entities for this resource.

Verify it's running

  1. Start the server and watch the console for [vs-impound-heist] lines. A missing Impound Job, a server with no robbable yard, a missing framework, or a missing item each print a named warning a few seconds after boot. See Troubleshooting for what each one means.
  2. Join, go to the fixer and choose Talk about work. If he offers a car and a yard, the install is working. You can run the whole loop solo: the crew is "up to" four, not "exactly" four.
  3. If a test run gets stuck, /impheistreset (console or admin) clears it. See Admin Commands.

Still stuck? See Troubleshooting & FAQ or open a ticket on Discord.