# Configuration

{% code title="shared/config.lua" lineNumbers="true" %}

```lua
Config = {}

--- [[ Markhor Bridge ]] ---
--- [[ Markhor Bridge ]] ---


--- This resource depends on Markhor Bridge.
--- With Markhor Bridge, all necessary settings (such as framework, inventory, interact, etc.) are automatically set.
--- You don't have to do anything except install Markhor Bridge.


--- [[ Markhor Bridge ]] ---
--- [[ Markhor Bridge ]] ---

Config.interactDistance = 2.0 -- Change the distance from where the player can interact with things.
Config.language = "EN" -- Choose Language -> "EN" / "NL".

Config.heistSettings = {
    start = {
        coords = vector4(-1150.6306, -2034.9393, 13.1606 -0.96, 134.4014),
        target = vector3(-1150.6306, -2034.9393, 13.1606),
        ped = "u_m_m_streetart_01", -- You can change the ped to whatever you want. List of peds: https://docs.fivem.net/docs/game-references/ped-models/
        spawned = false, -- Keep this false
        animation = {  -- This will add a animation to the ped, if you don"t want to have a animation set it to false
            dict = "rcmjosh1",
            anim = "idle"
        }
    },
    minCops = 2, -- The minimum number of cops (Config.copJobs) that must be online.
    hackItem = "vaulthacker", -- The item needed to start a robbery and to hack the vault.
    drillItem = "drill", -- The item needed to drill the safes open.
    securityItem = "trojan_usb", -- The item needed to disable the security.
    openDoorTimer = 300, -- Time in seconds for the vault door to open.
    cooldownSettings = {
        globalCooldown = false, -- Choose if you want to use a global or personal cooldown between robberies. Default: personal cooldown
        cooldownTime = 3600 -- Time in seconds between robberies
    },
    -- In blipSettings the blip settings can be adjusted to your own needs. https://docs.fivem.net/docs/game-references/blips/#blip-colors
    blipSettings = {
        colour = 1,
        alpha = 75,
        radius = 75.0
    },
    skillchecks = {
        securitySkillcheck = "volt-lab", -- Choose the hack minigame to disable the security -> "volt-lab" / "OTHER". You can add your own minigames or edit the difficulty in functions.lua
        vaultSkillcheck = "memorygame", -- Choose the hack minigame to open the vault -> "howdy-hackminigame" / "memorygame" / "boii_minigames" / "OTHER". You can add your own minigames or edit the difficulty in functions.lua
        safeSkillcheck = "GTA", -- Choose the hack minigame to open the vault -> "GTA" / "OTHER". You can add your own minigames or edit the difficulty in functions.lua
        safeSkillDiscs = 5 -- The amount of disc's that will be used while using the GTA Skillcheck.
    }
}

-- Once the loot has been picked up, the player receives a bag. This bag is the number of Config.replaceBag.
-- If a player already has a bag with a matching number in Config.maleBags or Config.womanBags,
-- this option will be skipped and the player will keep the bag that the player already has.
-- Also if you don't want to use this function you can change Config.changeBag to false
Config.changeBag = true
Config.maleBags = { 40, 41, 44, 45, 81, 82, 85, 86, 102, 103, 109, 112, 113, 114 }
Config.womanBags = { 40, 41, 44, 45, 81, 82, 85, 86, 104, 107, 108, 109, 110 }
Config.replaceBag = 45 -- The default bag a player receives when the player does not have a bag from Config.maleBags or Config.womanBags.
Config.skinEvent = 'skinchanger:getSkin' -- Change this event to your own event name.
Config.skinLoadEvent = 'skinchanger:loadClothes' -- Event to update the clothes.

-- The jobs in Config.copJobs will be notified when the alarm of a bank robbery has been triggered.
Config.copJobs = {
    'police',
    'army'
}

-- The jobs in Config.blacklistJobs cannot start a bank robbery.
Config.blacklistJobs = {
    'ambulance',
    'police',
    'mechanic'
}
```

{% endcode %}

{% code title="shared/sv\_config.lua" lineNumbers="true" %}

```lua
Server = {}

Server.logsWebhook = "WEBHOOK"

Server.heistSettings = {
    rewards = {
        -- In itemRewards the rewards of the deposit boxes can be set. Only items are possible without a specific value.
        -- The player will be rewarded with a random amount of a random item. The amount can be set with mix/maxRewards.
        itemRewards = {
            minRewards = 1,
            maxRewards = 3,
            items = {
                [1] = "goldchain",
                [2] = "diamond_ring",
                [3] = "rolex",
                [4] = "gold"
            }
        },
        -- In moneyRewards the rewards of the cash trolley can be set. Only money and items are possible, weapons are not.
        -- The minimal and maximal amount that the player gets is a random number between min and max
        -- The valueItem & valueAmount paremeters specifies whether the item should have a specific value and the amount of items that will be rewarded.
        -- You then get the specific amount items with a random number between min and max as value. [QBCORE only]
        moneyRewards = {type = "money", label = "Black Money", item = "black_money", valueItem = false, valueAmount = 1, minReward = 100000, maxReward = 200000},
    },
    banks = {
        [1] = {
            name = "LegionSquare",
            label = "Fleeca: Legion Square",
            busy = false, -- Keep this false
            bankOpen = false, -- Keep this false
            disableSecurity = {
                prop = "tr_prop_tr_elecbox_01a",
                coords = vector4(141.8998, -1057.1682, 29.1924, 340.0),
                disabled = false -- Keep this false
            },
            vaultDoorHack = {
                object = GetHashKey("v_ilev_gb_vauldr"),
                heading = {
                    open = 160.0,
                    closed = 250.0
                },
                coords = vector4(147.26, -1046.26, 29.57, 250.0),
                busy = false, -- Keep this false
                hacked = false -- Keep this false
            },
            lootPlacesVault = {
                [1] = {busy = false, opened = false, type = "trolley",coords = vector4(149.887, -1045.1, 29.37, 160)},
                [2] = {busy = false, opened = false, type = "trolley",coords = vector4(151.0132, -1046.6033, 29.3463, 70)},
                [3] = {busy = false, opened = false, type = "safe",coords = vector4(150.3047, -1049.8712, 29.3464, 247.7683)},
                [4] = {busy = false, opened = false, type = "safe",coords = vector4(148.0152, -1050.7388, 29.3464, 161.2101)},
                [5] = {busy = false, opened = false, type = "safe",coords = vector4(146.8572, -1048.4708, 29.3463, 77.3559)},
            },
        },
        [2] = {
            name = "PillboxMotel",
            label = "Fleeca: Pillbox Motel",
            busy = false,
            bankOpen = false,
            disableSecurity = {
                prop = "tr_prop_tr_elecbox_01a",
                coords = vector4(290.85778808594, -294.95199584961, 52.960597991943, 160.0),
                disabled = false
            },
            vaultDoorHack = {
                object = GetHashKey("v_ilev_gb_vauldr"),
                heading = {
                    open = 160.0,
                    closed = 250.0
                },
                coords = vector4(311.59, -284.63, 54.36, 160.0),
                busy = false,
                hacked = false
            },
            lootPlacesVault = {
                [1] = {busy = false, opened = false, type = "trolley", coords = vector4(314.0414, -283.4357, 54.1430, 160)},
                [2] = {busy = false, opened = false, type = "trolley", coords = vector4(315.5294, -284.9855, 54.1430, 70)},
                [3] = {busy = false, opened = false, type = "safe", coords = vector4(314.8351, -288.2431, 54.1431, 69.0979)},
                [4] = {busy = false, opened = false, type = "safe", coords = vector4(312.3922, -289.0302, 54.1431, 342.2792)},
                [5] = {busy = false, opened = false, type = "safe", coords = vector4(311.1674, -286.8487, 54.1430, 251.1207)},
            },
        },
        [3] = {
            name = "LSCBurton",
            label = "Fleeca: Los Santos Customs (Burton)",
            busy = false,
            bankOpen = false,
            disableSecurity = {
                prop = "tr_prop_tr_elecbox_01a",
                coords = vector4(-356.60321044922, -52.700325012207, 53.501689910889, 250.0),
                disabled = false
            },
            vaultDoorHack = {
                object = GetHashKey("v_ilev_gb_vauldr"),
                heading = {
                    open = 160.0,
                    closed = 250.0
                },
                coords = vector4(-353.47, -55.48, 49.24, 160.0),
                busy = false,
                hacked = false
            },
            lootPlacesVault = {
                [1] = {busy = false, opened = false, type = "trolley", coords = vector4(-350.9681, -54.1383, 49.0148, 160)},
                [2] = {busy = false, opened = false, type = "trolley", coords = vector4(-349.6494, -55.7487, 49.0148, 70)},
                [3] = {busy = false, opened = false, type = "safe", coords = vector4(-350.2295, -59.0387, 49.0149, 69.5732)},
                [4] = {busy = false, opened = false, type = "safe", coords = vector4(-352.5525, -59.9455, 49.0149, 345.9050)},
                [5] = {busy = false, opened = false, type = "safe", coords = vector4(-353.8898, -57.7005, 49.0148, 252.6358)},
            },
        },
        [4] = {
            name = "lifeinvaders",
            label = "Fleeca: Life Invaders",
            busy = false,
            bankOpen = false,
            disableSecurity = {
                prop = "tr_prop_tr_elecbox_01a",
                coords = vector4(-1200.4261474609, -340.24551391602, 36.577262878418, 115.0),
                disabled = false
            },
            vaultDoorHack = {
                object = GetHashKey("v_ilev_gb_vauldr"),
                heading = {
                    open = 160.0,
                    closed = 250.0
                },
                coords = vector4(-1210.40, -336.42, 37.98, 160.0),
                busy = false,
                hacked = false
            },
            lootPlacesVault = {
                [1] = {busy = false, opened = false, type = "trolley", coords = vector4(-1209.6520, -333.7449, 37.7592, 160)},
                [2] = {busy = false, opened = false, type = "trolley", coords = vector4(-1207.5869, -333.8501, 37.7592, 70)},
                [3] = {busy = false, opened = false, type = "safe", coords = vector4(-1205.5974, -336.5465, 37.7593, 123.2655)},
                [4] = {busy = false, opened = false, type = "safe", coords = vector4(-1206.6868, -338.7795, 37.7593, 27.2197)},
                [5] = {busy = false, opened = false, type = "safe", coords = vector4(-1208.8635, -338.1328, 37.7593, 291.2927)},
            },
        },
        [5] = {
            name = "highway",
            label = "Fleeca: Highway",
            busy = false,
            bankOpen = false,
            disableSecurity = {
                prop = "tr_prop_tr_elecbox_01a",
                coords = vector4(-2948.4768066406, 486.93023681641, 14.450967788696, 170.0),
                disabled = false
            },
            vaultDoorHack = {
                object = GetHashKey("hei_prop_heist_sec_door"),
                heading = {
                    open = 160.0,
                    closed = 250.0
                },
                coords = vector4(-2956.50, 482.06, 15.90, 350.0),
                busy = false,
                hacked = false
            },
            lootPlacesVault = {
                [1] = {busy = false, opened = false, type = "trolley", coords = vector4(-2958.4995, 484.0596, 15.6753, 270)},
                [2] = {busy = false, opened = false, type = "trolley", coords = vector4(-2957.3193, 485.7986, 15.6753, 180)},
                [3] = {busy = false, opened = false, type = "safe", coords = vector4(-2953.9014, 486.3755, 15.6754, 4.7109)},
                [4] = {busy = false, opened = false, type = "safe", coords = vector4(-2952.5554, 484.2612, 15.6754, 272.2295)},
                [5] = {busy = false, opened = false, type = "safe", coords = vector4(-2954.0576, 482.3837, 15.6753, 175.3552)},
            },
        },
        [6] = {
            name = "sandyshores",
            label = "Fleeca: Route 68",
            busy = false,
            bankOpen = false,
            disableSecurity = {
                prop = "tr_prop_tr_elecbox_01a",
                coords = vector4(1176.6029052734, 2721.8640136719, 37.00415802002, 180.0),
                disabled = false
            },
            vaultDoorHack = {
                object = GetHashKey("hei_prop_heist_sec_door"),
                panel = GetHashKey("v_corp_bk_secpanel"),
                heading = {
                    open = 0.5,
                    closed = 90.0
                },
                coords = vector4(1175.6130371094, 2712.90625, 38.288074493408, 90),
                busy = false,
                hacked = false
            },
            lootPlacesVault = {
                [1] = {busy = false, opened = false, type = "trolley", coords = vector4(1173.7284, 2710.7322, 38.0662, 0)},
                [2] = {busy = false, opened = false, type = "trolley", coords = vector4(1171.8621, 2711.9307, 38.0662, 270)},
                [3] = {busy = false, opened = false, type = "safe", coords = vector4(1171.2174, 2715.2002, 38.0663, 86.9793)},
                [4] = {busy = false, opened = false, type = "safe", coords = vector4(1173.3442, 2716.8516, 38.0663, 1.4337)},
                [5] = {busy = false, opened = false, type = "safe", coords = vector4(1175.2206, 2715.1501, 38.0663, 275.2075)},
            },
        }
    }
}
```

{% endcode %}

{% code title="language.lua" lineNumbers="true" %}

```lua
Language = {
    ["EN"] = {
        ["targetStartHeist"] = "Start heist",
        ["targetVaultHack"] = "Hack system",
        ["targetSecurity"] = "Disable security",
        ["targetLootMoney"] = "Loot money",
        ["targetLootSafe"] = "Drill safe",
        
        ["alreadyDoing"] = "Someone is already doing this",
        ["missingItem"] = "You are missing something to do this",
        ["noCops"] = "There are insufficient authorities employed",
        ["globalCooldown"] = "A bank robbery is already in progress",
        ["personalCooldown"] = "You have already started a bank robbery",
        ["startedHeist"] = "Disable the security near %s",
        ["availableHeists"] = "Available heists",
        ["breached"] = "Security successfully breached, vault door will open in a few minutes",

        ["securedMoney"] = "The cash trolley has been successfully secured",
        ["securedSafe"] = "Deposit box is still closed",
        ["blacklistJobs"] = "You are a cop. You can't start a robbery!",

        ["dispatchBlip"] = "Bankrobbery",
        ["dispatchAlarm"] = "Active bankrobbery at a Fleeca Bank",

        ["logsTitle"] = "Markhor Bankrobbery",
        ["logHeistStarted"] = "A robbery has been started by: \n**Identifier: *%s*** \n**Name: *%s*** \n **Bank: *%s (%s)* **",
        ["logAddedItem"] = "**Player: *%s (Player ID: %s)*\n has received ***%sx %s***",
        ["logAddedItemWorth"] = "**Player: *%s (Player ID: %s)***\n has received ***%sx %s*** with a value of ***$%s***",
        ["logRemovedItem"] = "**Player: *%s (Player ID: %s)***\n has removed ***%sx %s***",
        ["logAddedMoney"] = "**Player: *%s (Player ID: %s)***\n has received ***$%s (%s)***"
    },

    ["NL"] = {
        ["targetStartHeist"] = "Start heist",
        ["targetVaultHack"] = "Hack systeem",
        ["targetSecurity"] = "Beveiliging uitschakelen",
        ["targetLootMoney"] = "Pak geld",
        ["targetLootSafe"] = "Kluis uitboren",

        ["alreadyDoing"] = "Iemand is al bezig met dit",
        ["missingItem"] = "Je mist iets om dit te doen",
        ["noCops"] = "Er zijn onvoldoende autoriteiten in dienst",
        ["globalCooldown"] = "Er is al een bankoverval gaande",
        ["personalCooldown"] = "Je hebt al een bankoverval gestart",
        ["startedHeist"] = "Schakel de beveiliging uit in de buurt van %s",
        ["availableHeists"] = "Beschikbare overvallen",
        ["breached"] = "Beveiliging succesvol gekraakt, kluis wordt geopend in een aantal minuten",

        ["securedMoney"] = "Geldwagen is succesvol veilliggesteld",
        ["securedSafe"] = "Kluis is nog gesloten",
        ["blacklistJobs"] = "Je bent een agent. Je kan deze actie niet uitvoeren!",

        ["dispatchBlip"] = "Bank overval",
        ["dispatchAlarm"] = "Actieve bank overval bij een Fleeca Bank",

        ["logsTitle"] = "Markhor Bankrobbery",
        ["logHeistStarted"] = "Er is een overval gestart door: \n**Identifier: *%s*** \n**Name: *%s*** \n **Bank: *%s (%s)* **",
        ["logAddedItem"] = "**Speler: *%s (Speler ID: %s)***\n heeft ***%sx %s*** ontvangen",
        ["logAddedItemWorth"] = "**Speler: *%s (Speler ID: %s)***\n heeft ***%sx %s*** met een waarde van ***$%s*** ontvangen",
        ["logRemovedItem"] = "**Speler: *%s (Speler ID: %s)***\n heeft ***%sx %s*** verwijderd",
        ["logAddedMoney"] = "**Speler: *%s (Speler ID: %s)***\n heeft ***$%s (%s)*** ontvangen"
    },

}
```

{% endcode %}

{% code title="client/open\_functions.lua" lineNumbers="true" %}

```lua
securityMinigame = function()
    if Config.heistSettings.skillchecks.securitySkillcheck then
        local p = promise.new()
        TriggerEvent('ultra-voltlab', 60, function(result, reason)
            if result == 0 then
                p:resolve(false)
            elseif result == 1 then
                p:resolve(true)
            elseif result == 2 then
                p:resolve(false)
            elseif result == -1 then
                p:resolve(false)
                print('Error occured',reason)
            end
        end)
        return Citizen.Await(p)
    else
        -- Put your own code here
    end
end

vaultMinigame = function()
    if Config.heistSettings.skillchecks.vaultSkillcheck == "howdy-hackminigame" then
        return exports['howdy-hackminigame']:Begin(1, 15000)
    elseif Config.heistSettings.skillchecks.vaultSkillcheck  == "memorygame" then
        local p = promise.new()
        exports["memorygame"]:thermiteminigame(10, 3, 3, 10,
            function() -- success
                p:resolve(true)
            end,
            function() -- failure
                p:resolve(false)
            end
        )
        return Citizen.Await(p)
    elseif Config.heistSettings.skillchecks.vaultSkillcheck == "boii_minigames" then
        local p = promise.new()
        exports['boii_minigames']:chip_hack({
            style = 'default',
            loading_time = 8000, 
            chips = 2,
            timer = 20000 
        }, function(success)
            p:resolve(success)
        end)
        return Citizen.Await(p)
    else
        -- Add your own minigame here
    end
end

safeMinigame = function()
    if Config.heistSettings.skillchecks.safeSkillcheck == "GTA" then
        local p = promise.new()
        TriggerEvent("markhor_bankrobbery:client:drill", function(success)
            if success then
                p:resolve(true)
            else
                p:resolve(false)
            end
        end)
        return Citizen.Await(p)
    else
        -- Add your own minigame here
    end
end
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.markhorscripts.com/home/scripts/markhor-bank-robbery/configuration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
