> For the complete documentation index, see [llms.txt](https://fantasy-scripts.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://fantasy-scripts.gitbook.io/docs/robbery-creator/configuration-file.md).

# Configuration File

```lua
Config = Config or {}

-- =============================================
-- FRAMEWORK
-- Options: 'auto', 'esx', 'qbcore', 'qbox'
-- =============================================
Config.Framework = "qbox"

-- =============================================
-- ADMIN
-- =============================================
Config.AdminCommand = "robberycreator"
Config.AdminGroups  = { "admin", "owner", "god", "superadmin" }
Config.AdminAce     = "robbery.creator"

-- =============================================
-- TARGET RESOURCE
-- Options: 'auto', 'ox_target', 'qb-target', 'none'
-- 'none' = fallback to E key (DrawHelpText)
-- =============================================
Config.TargetResource = "ox_target"

-- =============================================
-- POLICE JOBS
-- =============================================
Config.PoliceJobs = { "police", "sheriff", "trooper" }

-- =============================================
-- DISPATCH
-- Auto-detects active dispatch resource.
-- Supported: tk_dispatch, cd_dispatch3d, ps-dispatch,
--   qs-dispatch, cd_dispatch, core_dispatch,
--   rcore_dispatch, origen_police, codem-dispatch,
--   enyo-policebackup, lb-tablet, kartik-mdt,
--   wasabi_mdt, u_dispatch
-- =============================================
Config.UseDispatch = true

Config.DispatchSettings = {
    alertHeader   = "Robbery in Progress",           -- notification title
    alertMessage  = "A robbery is being committed!", -- notification body (overridden per-robbery)
    alertCode     = "10-90",                         -- police code
    alertIcon     = "fas fa-user-secret",            -- FontAwesome icon
    alertPriority = 1,                               -- 1 = Red/High, 2 = Default, 3 = Low
    blipSprite    = 590,                             -- map blip sprite
    blipColor     = 1,                               -- map blip colour
    blipScale     = 1.0,                             -- map blip scale
    blipFlash     = true,                            -- blip flash animation
    alertSound    = "Lose_1st",                      -- alert sound name
}

-- =============================================
-- THERMITE
-- =============================================
Config.ThermiteTime       = 10000   -- burn duration ms (should match anim timing)
Config.ThermiteItem       = "thermite"
Config.ThermiteRemoveItem = true
Config.ThermiteAnimIndex  = 10      -- index into Config.Animations (thermite + bag scene)

-- Offset applied to the particle spawn position relative to the placed thermite prop.
-- scr_heist_ornate_thermal_burn has an internal visual shift — adjust these until
-- the sparks sit exactly on the prop. X = left/right, Y = forward/back, Z = up/down.
Config.ThermiteParticleOffset = { x = -0.4200, y = -1.0000, z = 0.0000 }

-- Extra rotation applied to the static thermite prop (on top of the door heading).
-- X = pitch (tilt forward/back), Y = roll (tilt left/right), Z = extra yaw.
-- Tune with /trx /try /trz then copy printed values here.
Config.ThermitePropRotation = { x = 90.0, y = 0.0, z = 0.0 }

-- =============================================
-- INTERACTION
-- Controls target interaction distance for ox_target, qb-target, and fallback key press
-- =============================================
Config.InteractionDistance = 0.6
Config.InteractionKey      = 38     -- E
Config.DrawText3D          = false

-- =============================================
-- NOTIFICATIONS
-- Options: 'auto', 'ox_lib', 'esx', 'qbcore'
-- =============================================
Config.NotifyResource = "auto"

-- =============================================
-- HACKABLE PROPS
-- Used for hackable stage objects (keypads, panels, etc.)
-- =============================================
Config.HackableProps = {
    "prop_ld_keypad_01b",
    "v_ilev_gb_vauldr",
    "hei_prop_hei_securitypanel",
    "ch_prop_fingerprint_scanner_01e",
    "tr_prop_tr_elecbox_01a",
    "prop_phonebox_01a",
    "h4_prop_h4_chain_lock_01a",
}

-- =============================================
-- ROBBABLE PROPS
-- Used for loot stage objects.
-- =============================================
Config.RobbableProps = {
    "h4_prop_h4_safe_01a",
    "p_chem_vial_02b_s",
    "tr_prop_tr_elecbox_01a",
    "xm_base_cia_server_01",
    "h4_prop_h4_glass_disp_01a",
    "ch_prop_fingerprint_scanner_01e",
    "hei_prop_hei_cash_trolly_01",
    "ch_prop_gold_trolly_01a",
    "ch_prop_diamond_trolly_01a",
    "imp_prop_impexp_coke_trolly",
    "h4_prop_h4_cash_stack_01a",
    "h4_prop_h4_gold_stack_01a",
    "h4_prop_h4_weed_stack_01a",
    "h4_prop_h4_coke_stack_01a",
    "tr_prop_tr_container_01a",
    "hei_prop_hei_securitypanel",
    "ch_prop_vault_painting_01a",
    "ch_prop_vault_painting_01b",
    "ch_prop_vault_painting_01c",
    "ch_prop_vault_painting_01d",
    "ch_prop_vault_painting_01e",
    "ch_prop_vault_painting_01f",
    "ch_prop_vault_painting_01g",
    "ch_prop_vault_painting_01h",
    "ch_prop_vault_painting_01i",
    "ch_prop_vault_painting_01j",
    "prop_cash_pile_02",
    "prop_poly_bag_money",
    "hei_prop_cash_crate_half_full",
    "bkr_prop_bkr_cashpile_04",
    "bkr_prop_bkr_cashpile_05",
    "v_ret_gc_gasmask",
    "ch_prop_ch_heist_drill",
    "w_sb_microsmg",
    "xm3_prop_xm3_crate_01a",
    "tr_prop_tr_adv_case_01a",
    -- Vehicles as lootable targets
    "thrax",
    "zorrusso",
    "taipan",
    "furia",
    "emerus",
}

-- =============================================
-- BANK DOOR MODELS
-- DO NOT REMOVE ANY OF THESE. Only add more bank vault door models if you need to.
-- =============================================
Config.BankDoorModels = {
    "v_ilev_bk_vaultdoor",     -- Big bank vault
    "v_ilev_gb_vauldr",        -- Silver vault door
    "hei_prop_heist_sec_door", -- Fleeca bank door
    "v_ilev_cbankvauldoor01",  -- Paleto bank door
}

-- =============================================
-- CUSTOM Z-AXIS OFFSETS FOR TARGET INDICATORS
-- This table is for changing the targets position on certain props that you add to Config.RobbableProps
-- because by default some targets wont allign right with all props.
-- =============================================
Config.CustomZAxisTargetsOnProps = {
    ["v_ilev_gb_vauldr"] = {
        Xoffset = 0.8,
        Yoffset = 0.0,
        Zoffset = 0.0,
    },
    ["xm_base_cia_server_01"] = {
        Xoffset = 0.0,
        Yoffset = -0.3,
        Zoffset = 1.0,
    },
    ["xm3_prop_xm3_crate_01a"] = {
        Xoffset = 0.0,
        Yoffset = -0.4,
        Zoffset = 1.0,
    },
    ["tr_prop_tr_adv_case_01a"] = {
        Xoffset = 0.0,
        Yoffset = -0.4,
        Zoffset = 0.4,
    },
    ["prop_phonebox_01a"] = {
        Xoffset = 0.0,
        Yoffset = 0.0,
        Zoffset = 1.0,
    },
}

------------------------------
Config.Animations = { -- Animations that can be used.
    [1] = {
        Name      = "Mechanic",
        AnimDict  = "anim@amb@clubhouse@tutorial@bkr_tut_ig3@",
        AnimAction = "machinic_loop_mechandplayer",
    },
    [2] = {
        Name        = "Mechanic (Moving)",
        AnimDict    = "anim@amb@clubhouse@tutorial@bkr_tut_ig3@",
        AnimAction  = "machinic_loop_mechandplayer",
        EmoteMoving = true,
    },
    [3] = {
        Name       = "Mechanic 2",
        AnimDict   = "mini@repair",
        AnimAction = "fixing_a_ped",
    },
    [4] = {
        Name        = "Type (Loop)",
        AnimDict    = "anim@heists@prison_heiststation@cop_reactions",
        AnimAction  = "cop_b_idle",
        EmoteLoop   = true,
        EmoteMoving = true,
    },
    [5] = {
        Name        = "Type 2 (Loop)",
        AnimDict    = "anim@heists@prison_heistig1_p1_guard_checks_bus",
        AnimAction  = "loop",
        EmoteLoop   = true,
        EmoteMoving = true,
    },
    [6] = {
        Name        = "Type 3 / Prison Hack (Loop)",
        AnimDict    = "mp_prison_break",
        AnimAction  = "hack_loop",
        EmoteLoop   = true,
        EmoteMoving = true,
    },
    [7] = {
        Name       = "Type 4 / FBI Heist (Loop)",
        AnimDict   = "mp_fbi_heist",
        AnimAction = "loop",
        EmoteLoop  = true,
    },
    [8] = {
        Name       = "Keypad Type",
        AnimDict   = "anim@heists@keypad@",
        AnimAction = "idle_a",
    },
    [9] = {
        Name       = "Guard Stand",
        AnimDict   = "WORLD_HUMAN_GUARD_STAND",
        IsScenario = true,
    },
    [10] = {
        -- NetworkCreateSynchronisedScene drives both ped and bag in lock-step.
        -- The thermite device prop is spawned separately by thermite.lua on the door face.
        -- BagAnimAction is the clip applied to the bag entity inside the scene.
        Name             = "Thermite and Bag scene",
        AnimDict         = "anim@heists@ornate_bank@thermal_charge",
        AnimAction       = "thermal_charge",
        BagModel         = "hei_p_m_bag_var22_arm_s",
        BagAnimAction    = "bag_thermal_charge",
        IsNetWorkedScene = true,
        SceneZOffset     = 1.1,  -- Raise if ped floats, lower if ped clips into ground
                                  -- 0.55 lifts the scene anchor above ped feet so the
                                  -- thermal_charge crouch doesn't sink below ground level
        -- XOffset/YOffset/ZOffset are only used when no extraData.coords is available
        -- (e.g. when called without a saved player-placement position).
        XOffset          = 0.0,
        YOffset          = 0.5,
        ZOffset          = 0.0,
    },
    [11] = {
        -- Uses NetworkCreateSynchronisedScene so the ped, bag, laptop, and card
        -- are all driven by the same scene — no bone offsets, no drift.
        Name                = "Laptop and Bag scene",
        IsNetworkedHackScene = true,
        AnimDict            = "anim@heists@ornate_bank@hack",
        BagModel            = "hei_p_m_bag_var22_arm_s",
        LaptopModel         = "hei_prop_hst_laptop",
        CardModel           = "hei_prop_heist_card_hack_02",
        EnterDuration       = 6300,   -- ms: hack_enter clip length
        LoopDuration        = 2000,   -- ms: hack_loop hold (minigame already done before anim)
        ExitDuration        = 4600,   -- ms: hack_exit clip length
        SceneZOffset        = 1.50,  -- lower the scene so the ped sits on the ground (tune if needed)
    },
    [12] = {
        Name                  = "Drilling and bag scene",
        IsNetworkedDrillScene = true,
        BagModel              = "hei_p_m_bag_var22_arm_s",
        DrillModel            = "ch_prop_ch_heist_drill",
        -- Ped is pre-positioned this far relative to the door before the scene starts.
        -- Scene is then anchored at the ped's resulting position so no further movement occurs.
        XOffset               = 0.2,
        YOffset               = 0.3,   -- closer to wall
        ZOffset               = 0.4,   -- raise anchor so drill crouch stays above floor
        IntroDuration         = 6200,
        DrillDuration         = 7500,
        ExitDuration          = 3500,
    },
    [13] = {
        Name               = "USB hack control pad device",
        NetworkedAnimations = { -- USB hack control pad device
            [1] = {
                AnimDict  = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                AnimAction = "action_var_01",
                WaitTime  = 6200,
                XOffset   = 0.2,
                YOffset   = 0.85, -- Adjust as needed for proper alignment
                ZOffset   = 0.35,
                AnimationOptions = {
                    AttachWaitDuration          = 1500,
                    TimeUntilFreezePropPosition = 3000,
                    PropBone                    = 60309, -- Right hand
                    Prop                        = "ch_prop_ch_usb_drive01x", -- USB drive
                    PropAnimationDict           = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                    PropAnimation               = "action_var_01_ch_prop_ch_usb_drive01x",
                    SecondProp                  = "prop_phone_ing", -- Phone
                    SecondPropAnimationDict     = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                    SecondPropAnimation         = "action_var_01_prop_phone_ing",
                }
            },
            [2] = {
                AnimDict  = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                AnimAction = "hack_loop_var_01",
                WaitTime  = 7500,
                XOffset   = 0.2,
                YOffset   = 0.85,
                ZOffset   = 0.35,
                AnimationOptions = {
                    AttachWaitDuration          = 1500,
                    TimeUntilFreezePropPosition = 3000,
                    PropBone                    = 60309,
                    Prop                        = "ch_prop_ch_usb_drive01x", -- USB drive
                    PropAnimationDict           = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                    PropAnimation               = "hack_loop_var_01_ch_prop_ch_usb_drive01x",
                    SecondProp                  = "prop_phone_ing", -- Phone
                    SecondPropAnimationDict     = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                    SecondPropAnimation         = "hack_loop_var_01_prop_phone_ing",
                }
            },
            [3] = {
                AnimDict  = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                AnimAction = "success_react_exit_var_01",
                WaitTime  = 3500,
                XOffset   = 0.1,
                YOffset   = 0.79,
                ZOffset   = 0.35,
                AnimationOptions = {
                    AttachWaitDuration          = 1500,
                    TimeUntilFreezePropPosition = 3000,
                    PropBone                    = 60309,
                    Prop                        = "ch_prop_ch_usb_drive01x", -- USB drive
                    PropAnimationDict           = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                    PropAnimation               = "success_react_exit_var_01_ch_prop_ch_usb_drive01x",
                    SecondProp                  = "prop_phone_ing", -- Phone
                    SecondPropAnimationDict     = "anim_heist@hs3f@ig1_hack_keypad@arcade@male@",
                    SecondPropAnimation         = "success_react_exit_var_01_prop_phone_ing",
                }
            },
        }
    },
    [14] = {
        Name         = "Smash case",
        AnimDict     = "missheist_jewel",
        AnimAction   = "smash_case_b",
        EmoteMoving  = true,
        SkipWaitTime = true,
    },
    [15] = {
        Name            = "Money Grab",
        AnimDict        = "anim@heists@ornate_bank@grab_cash_heels", -- Thermite and Bag scene
        AnimAction      = "grab",
        XOffset         = 0.3,
        YOffset         = 0.4,
        ZOffset         = 0.1,
        SkipWaitTime    = true,
        ReplacePropMini = true, -- Make this true and it will delete the prop that this animation is used on.
        AnimationOptions = {
            AttachWaitDuration          = 0,
            PropBone                    = 57005,
            PropPlacement               = {0.0, 0.0, -0.16, 250.0, -30.0, 0.0},
            Prop                        = "prop_cs_heist_bag_02",
            PropAnimationDict           = "anim@heists@ornate_bank@grab_cash_heels",
            TimeUntilFreezePropPosition = 0,
        }
    },
    [16] = {
        Name            = "Quick Grab",
        AnimDict        = "anim@am_hold_up@male",
        AnimAction      = "shoplift_mid",
        ReplacePropMini = true, -- Make this true and it will delete the prop that this animation is used on.
        SkipWaitTime    = true,
    },
    [17] = {
        Name       = "Welding",
        AnimDict   = "WORLD_HUMAN_WELDING",
        IsScenario = true,
    },
    [18] = {
        Name       = "Stand Mobile",
        AnimDict   = "WORLD_HUMAN_STAND_MOBILE",
        IsScenario = true,
    },
    [19] = {
        Name         = "Safe Crack",
        AnimDict     = "mini@safe_cracking",
        AnimAction   = "idle_base",
        SkipWaitTime = true,
    },

    -- ── Networked trolley-grab animations (IsNetworkedBagGrab) ───────────────
    -- These use a 3-phase NetworkCreateSynchronisedScene (intro → grab → exit)
    -- with a networked bag prop and a visible loot prop in the player's hand.
    -- Designed for multi-pile (pileCount > 1) robbable_object stages.
    -- Pair with an emptyModel on the stage so the trolley swaps to an empty
    -- version when all piles have been collected.
    --
    -- GrabDuration (ms): how long the middle "grab" phase lasts per pile.
    --   Increase for a slower, more deliberate loot feel.
    --   Default 6000 ms.  The intro adds ~1.5 s and the exit ~1.8 s on top.

    [20] = {
        Name           = "Trolley Loot — Cash (Networked)",
        IsNetworkedBagGrab = true,
        AnimDict       = "anim@heists@ornate_bank@grab_cash",
        BagModel       = "hei_p_m_bag_var22_arm_s",
        GrabProp       = "hei_prop_heist_cash_pile",  -- cash pile appears in ped's hand
        GrabPropBone   = 60309,                        -- right hand bone
        GrabDuration   = 37000,
    },
    [21] = {
        Name           = "Trolley Loot — Gold (Networked)",
        IsNetworkedBagGrab = true,
        AnimDict       = "anim@heists@ornate_bank@grab_cash",
        BagModel       = "hei_p_m_bag_var22_arm_s",
        GrabProp       = "ch_prop_gold_bar_01a",       -- gold bar appears in ped's hand
        GrabPropBone   = 60309,
        GrabDuration   = 37000,
    },
    [22] = {
        Name           = "Trolley Loot — Diamond (Networked)",
        IsNetworkedBagGrab = true,
        AnimDict       = "anim@heists@ornate_bank@grab_cash",
        BagModel       = "hei_p_m_bag_var22_arm_s",
        GrabProp       = "ch_prop_vault_dimaondbox_01a", -- diamond box in ped's hand
        GrabPropBone   = 60309,
        GrabDuration   = 37000,
    },
}

-- =============================================
-- WEAPONS (for "Requires Weapon In Hand")
-- =============================================
Config.Weapons = {
    { hash = "WEAPON_PISTOL",         label = "Pistol" },
    { hash = "WEAPON_COMBATPISTOL",   label = "Combat Pistol" },
    { hash = "WEAPON_SMG",            label = "SMG" },
    { hash = "WEAPON_MICROSMG",       label = "Micro SMG" },
    { hash = "WEAPON_ASSAULTRIFLE",   label = "Assault Rifle" },
    { hash = "WEAPON_CARBINERIFLE",   label = "Carbine Rifle" },
    { hash = "WEAPON_PUMPSHOTGUN",    label = "Pump Shotgun" },
    { hash = "WEAPON_SAWNOFFSHOTGUN", label = "Sawn-Off Shotgun" },
    { hash = "WEAPON_HEAVYSNIPER",    label = "Heavy Sniper" },
    { hash = "WEAPON_KNIFE",          label = "Knife" },
    { hash = "WEAPON_BAT",            label = "Baseball Bat" },
    { hash = "WEAPON_CROWBAR",        label = "Crowbar" },
    { hash = "WEAPON_DRILLGUN",       label = "Drill Gun" },
}

```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://fantasy-scripts.gitbook.io/docs/robbery-creator/configuration-file.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
