Page cover

Accessible files

Here you can find all the files which can be edite to make the asset compatible with your server.​

chevron-rightconfig.luahashtag
Config = {
    Core = 'automatic',  -- All core settings are in the 'core' folder.
    TextUI = 'brutal_textui', -- false / 'brutal_textui' / 'ox_lib' / 'okokTextUI' / 'ESXTextUI' / 'QBDrawText' // Custom can be add in the cl_utils.lua!!!
    Target = 'oxtarget', -- 'oxtarget' / 'qb-target' // if the TextUI is set to false target will step its place. | The Target cannot be false.
    ProgressBar = 'ox_lib', -- 'progressBars' / 'pogressBar' / 'mythic_progbar' / 'ox_lib' // Custom can be add in the cl_utils.lua!!!
    BrutalNotify = true, -- Buy here: (4€+VAT) https://store.brutalscripts.com | Or set up your own notify >> cl_utils.lua   
    BrutalKeys = true, -- Buy here: (15€+VAT) https://store.brutalscripts.com | Or set up your own if you're using a different vehicle key >> client-utils.lua
    BrutalGangs = true, -- Buy here: (35€+VAT) https://store.brutalscripts.com | Or set up your own if you're using a different gang script >> sv_utils.lua
    
    PlayerIdentityDisplay = "discord", -- "none" = character name with no picture | "discord" = discord name and profile picture | "steam" = steam name and profile picture 

    CopJobs = {'police', 'sheriff', 'fbi'}, -- Cop jobs
    RequiredCopsCount = 0, -- This is how many cops are needed to be in the server to start a heist

    Cooldown = 45, -- The time between robberies. (in minutes)

    RequiredPlayers = {
        min = 2, -- Minimum players required to start the heist.
        max = 8 -- Maximum players allowed to start the heist.
    },

    StartPoint = vector3(707.304077, -967.645569, 30.37602),

    Blips = {
        startblip = {use = true, label = 'Train Heist', size = 1.0, sprite = 795, color = 1},
        location = {label = 'Zone', size = 0.8, sprite = 568, color = 47, radiusblip = {radius = 50.0, color = 0}},
        guard = {use = true, label = 'Enemy', size = 0.5, sprite = 1, color = 0},
        box = {use = true, size = 0.5, sprite = 568, color = 2},
        intelhack = {label = 'Railway Control Tower', size = 0.8, sprite = 767, color = 3, radiusblip = {radius = 50.0, color = 0}},
        bombzone = {label = 'Bomb Plant Zone', size = 0.8, sprite = 653, color = 1, radiusblip = {radius = 80.0, color = 0}},
        bomb = {use = true, size = 0.5, sprite = 1, color = 1},
        train = {use = true, size = 0.8, sprite = 795, color = 5},
        big_alert = {size = 1.0, sprite = 161, color = 1},
        small_alert = {label = 'Train Robbery', size = 0.5, sprite = 795, color = 1},
        trainzone = {label = 'Train Robbery Zone', size = 0.8, sprite = 795, color = 40, radiusblip = {radius = 100.0, color = 1}},
        sell_ped = {use = true, label = 'Trader', size = 1.0, sprite = 272, color = 2},
    },

    Marker = {use = true, marker = 20, rgba = {233, 88, 69, 255}, bobUpAndDown = false, rotate = false},

    OutlineSettings = {use = true, rgba = {255, 0, 0, 255}}, -- only usable with target option

    DefaultMiniGame = {      
        remainingTime = 30, -- Time limit (in seconds) to complete the minigame.

        controls = {
            Horizontal = {label = "Select", keys = {174, 175}},
            Vertical = {label = "Move", keys = {172, 173}},
            Confirm = {label = "Confirm", key = 201},
            Exit = {label = "Quit", key = 202},
        },
    },

    HeistItemRequirements = {
        bag = {required = false, item = 'train_bag'},
        cutter = {required = false, item = 'train_cutter'},
    },

    LootChances = {
        cash = {
            chance = 40,
            model = 'h4_prop_h4_cash_stack_01a'
        },
        gold = {
            chance = 10,
            model = 'h4_prop_h4_gold_stack_01a'
        },
        weed = {
            chance = 25,
            model = 'h4_prop_h4_weed_stack_01a'
        },
        coke = {
            chance = 25,
            model = 'h4_prop_h4_coke_stack_01a'
        }
    },

    RewardItems = {
        cash = {item = false, count = {1000, 2000}},
        gold = {item = 'train_gold', count = {10, 20}, sellPrice = 150},
        weed = {item = 'train_weed', count = {10, 20}, sellPrice = 500},
        coke = {item = 'train_coke', count = {10, 20}, sellPrice = 500},
    },

    GasSettings = {
        timeout = 1,  -- delay between damage applications (seconds)
        damage = 5 -- amount of damage to deal
    }, 

    GasMask = {
        drawable = 175, -- gas mask drawable ID (component 1)
        texture  = 0
    },

    SellItem = {
        Use = true,
        AvailableLimit = 10, -- in minutes
        Locations = {
            {model = 'a_m_m_socenlat_01', coords = vector4(1247.2794, -349.6277, 69.2098, 359.0937)},
            {model = 'csb_grove_str_dlr', coords = vector4(713.9440, -716.9745, 26.1284, 187.2431)},
            {model = 'a_m_y_soucent_02', coords = vector4(659.8383, 263.6920, 102.7156, 245.5291)},
            {model = 'a_m_y_stbla_02', coords = vector4(-297.1065, 303.8560, 90.7183, 6.0962)},
            {model = 's_m_y_dealer_01', coords = vector4(-444.4843, 288.3656, 83.2293, 0.4235)},
            {model = 'u_m_m_aldinapoli', coords = vector4(-538.0673, -44.3825, 42.6501, 336.5557)},
            {model = 'a_m_y_soucent_02', coords = vector4(1705.0630, 3845.5530, 34.9316, 263.0338)},
            {model = 's_m_y_dealer_01', coords = vector4(1865.5641, 3760.0134, 32.9984, 301.5822)},
            {model = 'a_m_m_socenlat_01', coords = vector4(1619.3677, 3712.4905, 35.0122, 106.1937)},
            {model = 'u_m_m_aldinapoli', coords = vector4(1361.8351, 3650.8013, 33.8263, 253.3179)},
            {model = 'a_m_y_stbla_02', coords = vector4(905.7675, 3586.4617, 33.4232, 4.5537)},
            {model = 's_m_y_dealer_01', coords = vector4(469.6562, 3552.2849, 33.2386, 170.1622)},
            {model = 'a_m_y_soucent_02', coords = vector4(2531.3792, 4114.2500, 38.7566, 245.7183)},
        },
    },

    Heists = {
        ["bridge"] = {
            Preparations = {
                [1] = {
                    Location = vector3(2129.0015, 4790.0303, 40.9915),
                    Guards = {
                        {model = 'csb_mweather', coords = vector4(2122.6404, 4782.0688, 40.9703, 309.2416), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2126.8987, 4776.7412, 40.9703, 305.5225), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2130.4270, 4770.7261, 40.9703, 338.5098), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2137.8213, 4773.1309, 40.9741, 35.9897), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2143.5886, 4779.4214, 40.9703, 45.4057), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2139.7971, 4789.9272, 40.9703, 48.6179), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                    },
                    Boxes = {
                        {coords = vector4(2118.7141, 4783.2744, 39.9940, 120.4609), type = 'bomb', item = 'train_bomb', model = 'prop_c4_final_green'},
                        {coords = vector4(2145.3027, 4774.4478, 40.0173, 207.7516), type = 'hardrive', item = 'train_hardrive', model = 'tr_prop_tr_carry_box_01a'},
                        {coords = vector4(2128.3127, 4769.3145, 39.9703, 123.5506), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'},  
                        {coords = vector4(2137.1599, 4768.9072, 40.0534, 200.8665), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                    },
                },
                [2] = {
                    Location = vector3(1731.5267, 3310.9089, 41.2235),
                    Guards = {
                        {model = 'csb_mweather', coords = vector4(1726.1635, 3294.3464, 41.2235, 285.0655), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1721.7025, 3304.6895, 41.2235, 281.6930), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(1718.9696, 3315.7917, 41.2235, 282.3250), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1740.4760, 3321.5305, 41.2235, 101.2765), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(1742.9813, 3312.3359, 41.2235, 104.9130), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1745.1475, 3302.8254, 41.2235, 98.6695), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(1730.3207, 3325.9863, 41.2235, 198.7548), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1721.9795, 3320.0713, 41.2235, 195.2746), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                    },
                    Boxes = {
                        {coords = vector4(1722.4248, 3293.2676, 40.2235, 198.2820), type = 'bomb', item = 'train_bomb', model = 'prop_c4_final_green'},
                        {coords = vector4(1717.0271, 3312.6875, 40.2235, 106.8903), type = 'hardrive', item = 'train_hardrive', model = 'tr_prop_tr_carry_box_01a'},
                        {coords = vector4(1740.1483, 3328.9346, 40.2235, 286.8617), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'},  
                        {coords = vector4(1748.0651, 3300.2466, 40.2235, 284.5108), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                        {coords = vector4(1732.6591, 3329.2673, 40.2235, 19.8484), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                        {coords = vector4(1715.8104, 3325.1453, 40.2235, 23.8564), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                    },
                },
                [3] = {
                    Location = vector3(2350.1655, 3134.6350, 48.2087),
                    Guards = {
                        {model = 'csb_mweather', coords = vector4(2342.3938, 3142.5447, 48.2087, 169.7034), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2348.0337, 3138.8513, 48.2087, 85.4403), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2357.9268, 3137.6233, 48.2087, 177.8912), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2359.8203, 3126.5769, 48.2087, 44.2515), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2349.5674, 3128.8757, 48.2087, 50.8631), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2340.5811, 3132.5957, 48.2087, 355.9480), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                    },
                    Boxes = {
                        {coords = vector4(2337.6499, 3123.4609, 47.2087, 83.8837), type = 'bomb', item = 'train_bomb', model = 'prop_c4_final_green'},
                        {coords = vector4(2359.6799, 3119.8875, 47.2087, 261.6295), type = 'hardrive', item = 'train_hardrive', model = 'tr_prop_tr_carry_box_01a'},
                        {coords = vector4(2356.2417, 3143.5625, 47.2087, 351.3960), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'},  
                        {coords = vector4(2351.5308, 3144.2468, 47.2087, 355.3236), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                    },
                }
            },
            IntelHack = {coords = vector3(2634.3740, 2932.0898, 44.7390), model = 'prop_monitor_03b'},
            BombZone = {
                Location = vector3(-515.5876, 4425.8540, 89.0503),
                BombPlaces = {
                    {coords = vector3(-516.245, 4435.432, 88.05), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-517.361, 4435.267, 88.05), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-516.048, 4433.911, 88.05), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-517.161, 4433.784, 88.05), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-515.876, 4432.431, 88.05), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-516.912, 4432.309, 88.05), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-515.660, 4430.959, 88.076), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-516.719, 4430.806, 88.076), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-515.424, 4429.501, 88.076), rotation = vector3(-88.688, 0, 0)},
                    {coords = vector3(-516.539, 4429.337, 88.076), rotation = vector3(-88.688, 0, 0)},
                },                          
                SmokePlaces = {
                    {coords = vector3(-509.9972, 4377.7729, 89.0259)},
                    {coords = vector3(-511.1148, 4393.3340, 89.0506)},
                    {coords = vector3(-512.7263, 4404.0317, 89.0470)},
                    {coords = vector3(-514.5106, 4421.2886, 89.0441)},
                    {coords = vector3(-516.4875, 4433.5581, 89.0510)},
                    {coords = vector3(-520.7230, 4462.7349, 89.0484)},
                    {coords = vector3(-523.3897, 4478.9053, 89.0373)},
                    {coords = vector3(-524.8683, 4495.7500, 89.0467)},
                    {coords = vector3(-501.4372, 4443.3901, 31.2503)},
                    {coords = vector3(-504.4868, 4349.7251, 89.0399)},
                    {coords = vector3(-504.4868, 4349.7251, 89.0399)},
                    {coords = vector3(-500.5934, 4319.2661, 89.0461)},
                    {coords = vector3(-519.1924, 4367.0928, 67.5693)},
                },
            },
            TrainSpawn = vector3(-367.4225, 5903.9741, 46.5291),
            RandomContainerCount = {min = 3, max = 8}, -- How many containers will be randomly selected.
            Containers = {
                {coords = vector3(-510.579, 4389.936, 88.052), rotation = vector3(0.000, 0.000, 8.204)},
                {coords = vector3(-508.663, 4375.843, 88.052), rotation = vector3(0.000, 0.000, 8.204)},
                {coords = vector3(-507.268, 4366.505, 88.051), rotation = vector3(0.000, 0.000, -170.926)},
                {coords = vector3(-506.737, 4361.888, 88.048), rotation = vector3(0.000, 0.000, 8.510)},
                {coords = vector3(-505.394, 4352.630, 88.052), rotation = vector3(0.000, 0.000, -171.167)},
                {coords = vector3(-504.660, 4347.548, 88.051), rotation = vector3(0.000, 0.000, 7.316)},
                {coords = vector3(-503.430, 4338.175, 88.043), rotation = vector3(0.000, 0.000, -173.086)},
                {coords = vector3(-502.771, 4333.455, 88.052), rotation = vector3(0.000, 0.000, 7.848)},
                {coords = vector3(-501.526, 4324.538, 88.046), rotation = vector3(0.000, 0.000, -171.304)},
                {coords = vector3(-521.128, 4368.152, 66.518), rotation = vector3(0.000, 0.000, 57.312)},
            },
        },
        ["factory"] = {
            Preparations = {
                [1] = {
                    Location = vector3(2129.0015, 4790.0303, 40.9915),
                    Guards = {
                        {model = 'csb_mweather', coords = vector4(2122.6404, 4782.0688, 40.9703, 309.2416), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2126.8987, 4776.7412, 40.9703, 305.5225), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2130.4270, 4770.7261, 40.9703, 338.5098), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2137.8213, 4773.1309, 40.9741, 35.9897), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2143.5886, 4779.4214, 40.9703, 45.4057), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2139.7971, 4789.9272, 40.9703, 48.6179), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                    },
                    Boxes = {
                        {coords = vector4(2118.7141, 4783.2744, 39.9940, 120.4609), type = 'bomb', item = 'train_bomb', model = 'prop_c4_final_green'},
                        {coords = vector4(2145.3027, 4774.4478, 40.0173, 207.7516), type = 'hardrive', item = 'train_hardrive', model = 'tr_prop_tr_carry_box_01a'},
                        {coords = vector4(2128.3127, 4769.3145, 39.9703, 123.5506), type = 'gasmask', item = 'train_gasmask', model = 'prop_player_gasmask'},  
                        {coords = vector4(2137.1599, 4768.9072, 40.0534, 200.8665), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                    },
                },
                [2] = {
                    Location = vector3(1731.5267, 3310.9089, 41.2235),
                    Guards = {
                        {model = 'csb_mweather', coords = vector4(1726.1635, 3294.3464, 41.2235, 285.0655), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1721.7025, 3304.6895, 41.2235, 281.6930), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(1718.9696, 3315.7917, 41.2235, 282.3250), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1740.4760, 3321.5305, 41.2235, 101.2765), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(1742.9813, 3312.3359, 41.2235, 104.9130), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1745.1475, 3302.8254, 41.2235, 98.6695), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(1730.3207, 3325.9863, 41.2235, 198.7548), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(1721.9795, 3320.0713, 41.2235, 195.2746), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                    },
                    Boxes = {
                        {coords = vector4(1722.4248, 3293.2676, 40.2235, 198.2820), type = 'bomb', item = 'train_bomb', model = 'prop_c4_final_green'},
                        {coords = vector4(1717.0271, 3312.6875, 40.2235, 106.8903), type = 'hardrive', item = 'train_hardrive', model = 'tr_prop_tr_carry_box_01a'},
                        {coords = vector4(1740.1483, 3328.9346, 40.2235, 286.8617), type = 'gasmask', item = 'train_gasmask', model = 'prop_player_gasmask'},  
                        {coords = vector4(1748.0651, 3300.2466, 40.2235, 284.5108), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                        {coords = vector4(1732.6591, 3329.2673, 40.2235, 19.8484), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                        {coords = vector4(1715.8104, 3325.1453, 40.2235, 23.8564), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                    },
                },
                [3] = {
                    Location = vector3(2350.1655, 3134.6350, 48.2087),
                    Guards = {
                        {model = 'csb_mweather', coords = vector4(2342.3938, 3142.5447, 48.2087, 169.7034), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2348.0337, 3138.8513, 48.2087, 85.4403), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2357.9268, 3137.6233, 48.2087, 177.8912), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2359.8203, 3126.5769, 48.2087, 44.2515), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                        {model = 'csb_mweather', coords = vector4(2349.5674, 3128.8757, 48.2087, 50.8631), weapon = 'WEAPON_ASSAULTRIFLE', armour = 50},
                        {model = 'csb_mweather', coords = vector4(2340.5811, 3132.5957, 48.2087, 355.9480), weapon = 'WEAPON_ASSAULTRIFLE', armour = 0},
                    },
                    Boxes = {
                        {coords = vector4(2337.6499, 3123.4609, 47.2087, 83.8837), type = 'bomb', item = 'train_bomb', model = 'prop_c4_final_green'},
                        {coords = vector4(2359.6799, 3119.8875, 47.2087, 261.6295), type = 'hardrive', item = 'train_hardrive', model = 'tr_prop_tr_carry_box_01a'},
                        {coords = vector4(2356.2417, 3143.5625, 47.2087, 351.3960), type = 'gasmask', item = 'train_gasmask', model = 'prop_player_gasmask'},  
                        {coords = vector4(2351.5308, 3144.2468, 47.2087, 355.3236), type = 'moneybag', item = 'false', amount = {500, 1500}, model = 'ch_prop_ch_moneybag_01a'}, 
                    },
                }
            },
            IntelHack = { coords = vector3(2634.3740, 2932.0898, 44.7390), model = 'prop_monitor_03b'},
            BombZone = {
                Location = vector3(2610.7947, 1421.9760, 33.5828),
                BombPlaces = {
                    {coords = vector3(2610.334, 1417.522, 32.790), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2611.391, 1417.526, 32.790), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2611.391, 1419.011, 32.731), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2610.270, 1419.011, 32.725), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2610.285, 1420.497, 32.654), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2611.399, 1420.525, 32.654), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2611.399, 1422.012, 32.610), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2610.277, 1422.012, 32.610), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2610.277, 1423.509, 32.534), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2611.369, 1423.509, 32.540), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2611.369, 1425.020, 32.488), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2610.270, 1425.004, 32.488), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2610.270, 1426.491, 32.417), rotation = vector3(-92.500, 0, 0)},
                    {coords = vector3(2611.375, 1426.520, 32.417), rotation = vector3(-92.500, 0, 0)},
                }, 
                SmokePlaces = {
                    {coords = vector3(2628.0559, 1369.4382, 29.8908)}, 
                    {coords = vector3(2616.4060, 1369.6525, 35.5726)}, 
                    {coords = vector3(2612.3450, 1390.2726, 34.9352)}, 
                    {coords = vector3(2613.9192, 1414.8784, 33.9219)}, 
                    {coords = vector3(2612.1492, 1441.8430, 32.7717)}, 
                    {coords = vector3(2608.9656, 1453.8784, 32.2764)}, 
                    {coords = vector3(2610.2146, 1472.0502, 31.7424)}, 
                    {coords = vector3(2617.8430, 1485.2742, 29.5733)}, 
                    {coords = vector3(2630.5115, 1497.5740, 27.0689)}, 
                    {coords = vector3(2615.0764, 1508.8282, 30.5790)},
                    {coords = vector3(2621.5500, 1520.6754, 27.8634)},
                    {coords = vector3(2613.2007, 1529.7878, 29.8665)},
                    {coords = vector3(2619.6633, 1544.1962, 28.7293)},
                    {coords = vector3(2613.9958, 1560.1709, 29.1056)},
                    {coords = vector3(2611.9482, 1575.3296, 28.9858)},
                    {coords = vector3(2617.3188, 1588.5549, 28.5594)},
                    {coords = vector3(2614.4478, 1606.4155, 28.1906)},
                    {coords = vector3(2610.9866, 1619.5558, 28.1523)},
                    {coords = vector3(2614.1160, 1656.3911, 27.6038)},
                    {coords = vector3(2609.5598, 1672.5216, 27.1769)},
                },
            },
            TrainSpawn = vector3(2486.4639, 2346.0813, 36.0569), 
            GasPlaces = {
                {coords = vector3(2616.7905, 1473.6765, 30.2613)}, 
                {coords = vector3(2618.5535, 1539.7538, 29.5740)}, 
                {coords = vector3(2610.8108, 1665.6879, 27.3421)}, 
                {coords = vector3(2633.6008, 1504.5378, 26.6806)}, 
                {coords = vector3(2617.9231, 1385.7976, 34.5705)}, 
            },
            RandomContainerCount = {min = 5, max = 10}, -- How many containers will be randomly selected.
            Containers = {
                {coords = vector3(2609.704, 1607.990, 28.648), rotation = vector3(0.000, 0.000, 49.163)}, 
                {coords = vector3(2616.063, 1602.474, 28.648), rotation = vector3(0.000, 0.000, -130.801)}, 
                {coords = vector3(2609.930, 1578.752, 29.677), rotation = vector3(0.000, 0.000, 4.141)}, 
                {coords = vector3(2610.511, 1570.413, 29.677), rotation = vector3(0.000, 0.000, -176.114)}, 
                {coords = vector3(2611.779, 1533.934, 30.699), rotation = vector3(0.000, 0.000, -4.521)}, 
                {coords = vector3(2611.084, 1525.470, 30.699), rotation = vector3(0.000, 0.000, 175.164)},
                {coords = vector3(2614.089, 1512.160, 31.286), rotation = vector3(0.000, 0.000, -15.543)},
                {coords = vector3(2611.824, 1503.972, 31.286), rotation = vector3(0.000, 0.000, 164.421)},
                {coords = vector3(2607.922, 1458.935, 32.744), rotation = vector3(0.000, 0.000, 32.821)},
                {coords = vector3(2612.504, 1451.858, 32.744), rotation = vector3(0.000, 0.000, -147.890)},
            },
        },
    },

    -----------------------------------------------------------
    -----------------------| TRANSLATE |-----------------------
    -----------------------------------------------------------
    
    NUILanguage = "en", -- "en", "es", "fr", "de", "pt", "it", "pl", "nl", "ru", "tr", "hu", "ro", "cs", "sv", "ar"

    MoneyForm = '$', -- Money form

    Locales = {
        SellTimerTitle = "Sell Loot",
        SellTimerDescription = "Deliver your loot to the buyer before it's too late.",
        Minutes = 'minutes.',
        SoldItems = "Sold Items",
        Success = "SUCCESS",
        Fail = "FAIL"
    },

    Progressbar = {
        Checking = {'Checking the body...', 4000}, -- text, time
    },

    Texts = {
        [1] = {'[E] - Open Menu', 38, 'Open Menu', 'fa-solid fa-laptop'},
        [2] = {'[E] - Check the body', 38, 'Check the body', 'fa-solid fa-magnifying-glass'},
        [3] = {'[E] - Open the crate', 38, 'Open the crate', 'fa-solid fa-box'},
        [4] = {'[E] - Hack the hard drive', 38, 'Hack the hard drive', 'fa-solid fa-hard-drive'},
        [5] = {'[E] - Plant the bomb', 38, 'Plant the bomb', 'fa-solid fa-bomb'},
        [6] = {'[E] - Open Container', 38, 'Open Container', 'fa-solid fa-door-open'},
        [7] = {'[E] - Grab Stack', 38, 'Grab Stack', 'fa-solid fa-hand'},
        [8] = {'[E] - Sell the items', 38, 'Sell the items', 'fa-solid fa-user-secret'},
    },
    
    -- Notify function EDITABLE >> cl_utils.lua
    Notify = { 
        [1] = {"Train Heist", "The heist has started!", 5000, 'success'},
        [2] = {"Train Heist", "Take down all guards", 5000, "info"},
        [3] = {"Train Heist", "Put the gun away!", 5000, 'error'},
        [4] = {"Train Heist", "You can not do this in a vehicle!", 5000, 'error'},
        [5] = {"Train Heist", "You didn't find anything during the search.", 5000, 'error'},
        [6] = {"Train Heist", "You found the opening code for the crates.", 5000, 'success'},
        [7] = {"Train Heist", "All crates are now unlocked and can be opened.", 5000, "info"},
        [8] = {"Train Heist", "All guards have been eliminated! Search their bodies to find the code for opening the crates.", 10000, "info"},
        [9] = {"Train Heist", "You got:", 5000, 'success'},
        [10] = {"Train Heist", "Go to the Railway Control Tower and extract the data from the hard drive to obtain information about the target train.", 15000, "info"},
        [11] = {"Train Heist", "Go to the bomb plant zone and place the charges at the marked locations.", 10000, "info"},
        [12] = {"Train Heist", "You have successfully obtained the information.", 5000, 'success'},
        [13] = {"Train Heist", "You failed to obtain the information.", 5000, 'error'},
        [14] = {"Train Heist", "You don't have the required item:", 5000, 'error'},
        [15] = {"Train Heist", "All bombs are in place. The train is entering the area. Get ready.", 5000, "info"},
        [16] = {"Train Heist", "Not enough cops in the City!", 5000, 'error'},
        [17] = {"Train Heist", "The heist has already started. Please try again later.", 5000, 'error'},
        [18] = {"Train Heist", "Not enough team player to start the heist.", 5000, 'error'},
        [19] = {"Train Heist", "Too many team players to start the heist", 5000, 'error'},
        [20] = {"Train Heist", "You have been removed from the heist by the leader.", 5000, 'error'},
        [21] = {"Train Heist", "Train already robbed. Available again at:", 5000, 'error'},
        [22] = {"Train Heist", "Sell the items in the designated place!", 10000, 'info'},
        [23] = {"Train Heist", "You sold:", 5000, 'success'},
        [24] = {"Train Heist", "You have nothing useful!", 5000, 'error'},
        [25] = {"Train Heist", "You have looted everything. Leave the train area to receive your selling location.", 10000, 'info'},
        [26] = {"Train Heist", "You have left the area. Waiting for the rest of your team.", 7000, 'success'},
        [27] = {"Train Heist", "Time's up! The Trader has left!", 5000, 'error'},
    },

    Webhooks = {
        DateFormat = '%d/%m/%Y - %X',

        Locale = {
            ['heistProcess'] = '⌛ Heist started...',
            ['heistFinished'] = '✅ Heist finished.',
            ['heistSold'] = '💰 Sold loot.',

            ['HasStarted'] = 'started the Train Heist!',
            ['HasFinished'] = 'finished the Train Heist!',
            ['HasSoldLoot'] = 'has sold all loot items.',

            ['Identifier'] = 'Identifier',
            ['Time'] = 'Time ⏲️'
        },

        -- To change a webhook color you need to set the decimal value of a color, you can use this website to do that - https://www.mathsisfun.com/hexadecimal-decimal-colors.html
        Colors = {
            ['heistProcess'] = 3145631, 
            ['heistFinished'] = 16711680
        }
    },
}
chevron-rightclient-utils.luahashtag
ESX = Core
QBCore = Core

-- Buy here: (4€+VAT) https://store.brutalscripts.com
function notification(title, text, time, type)
    if Config.BrutalNotify then
        exports['brutal_notify']:SendAlert(title, text, time, type)
    else
        -- Put here your own notify and set the Config.BrutalNotify to false
        SetNotificationTextEntry("STRING")
        AddTextComponentString(text)
        DrawNotification(0,1)

        -- Default ESX Notify:
        --TriggerEvent('esx:showNotification', text)

        -- Default QB Notify:
        --TriggerEvent('QBCore:Notify', text, 'info', 5000)

        -- OKOK Notify:
        -- exports['okokNotify']:Alert(title, text, time, type, false)

    end
end

function TextUIFunction(type, text)
    if type == 'open' then
        if Config.TextUI:lower() == 'ox_lib' then
            lib.showTextUI(text)
        elseif Config.TextUI:lower() == 'okoktextui' then
            exports['okokTextUI']:Open(text, 'darkblue', 'right')
        elseif Config.TextUI:lower() == 'esxtextui' then
            ESX.TextUI(text)
        elseif Config.TextUI:lower() == 'qbdrawtext' then
            exports['qb-core']:DrawText(text,'left')
        elseif Config.TextUI:lower() == 'brutal_textui' then
            exports['brutal_textui']:Open(text, "blue")
        end
    elseif type == 'hide' then
        if Config.TextUI:lower() == 'ox_lib' then
            lib.hideTextUI()
        elseif Config.TextUI:lower() == 'okoktextui' then
            exports['okokTextUI']:Close()
        elseif Config.TextUI:lower() == 'esxtextui' then
            ESX.HideUI()
        elseif Config.TextUI:lower() == 'qbdrawtext' then
            exports['qb-core']:HideText()
        elseif Config.TextUI:lower() == 'brutal_textui' then
            exports['brutal_textui']:Close()
        end
    end
end

function ProgressBarFunction(time, text)
    if Config.ProgressBar:lower() == 'progressbars' then --LINK: https://github.com/EthanPeacock/progressBars/releases/tag/1.0
        exports['progressBars']:startUI(time, text)
        Citizen.Wait(time)
    elseif Config.ProgressBar:lower() == 'pogressbar' then -- LINK: https://github.com/SWRP-PUBLIC/pogressBar
        exports['pogressBar']:drawBar(time, text)
        Citizen.Wait(time)
    elseif Config.ProgressBar:lower() == 'ox_lib' then
        lib.progressBar({
            duration = time,
            label = text,
            useWhileDead = false,
            canCancel = true,
        })
    end
end

function PlayerDied()
    if GetResourceState("brutal_ambulancejob") == "started" then
        return exports.brutal_ambulancejob:IsDead()
    elseif GetResourceState("wasabi_ambulance") == "started" then
        return exports.wasabi_ambulance:isPlayerDead()
    else
        if IsEntityDead(PlayerPedId()) then
            return true
        else
            return false
        end
    end
end

RegisterNetEvent('brutal_train_heist:client:PoliceAlert')
AddEventHandler('brutal_train_heist:client:PoliceAlert', function(type, index, coords)
    if type == 'create' then
        if GetResourceState("brutal_policejob") == "started" then
            local streetLabel = GetStreetNameFromHashKey(GetStreetNameAtCoord(coords.x, coords.y, coords.z))
            TriggerServerEvent('brutal_policejob:server:citizencall', 'create', 'Train Heist in progress', {coords.x, coords.y, coords.z}, streetLabel)
        end

        notification('Train Heist', 'A heist is in progress at #'..index..'. Location marked on your map!', 10000, 'info')

        local BigAlert = AddBlipForCoord(coords.x, coords.y, coords.z)
        SetBlipSprite(BigAlert, Config.Blips.big_alert.sprite)
        SetBlipScale(BigAlert, Config.Blips.big_alert.size)
        SetBlipColour(BigAlert, Config.Blips.big_alert.color)

        local SmallAlert = AddBlipForCoord(coords.x, coords.y, coords.z)
        SetBlipSprite(SmallAlert, Config.Blips.small_alert.sprite)
        SetBlipScale(SmallAlert, Config.Blips.small_alert.size)
        SetBlipColour(SmallAlert, Config.Blips.small_alert.color)
        BeginTextCommandSetBlipName('STRING')
        AddTextComponentSubstringPlayerName(Config.Blips.small_alert.label)
        EndTextCommandSetBlipName(SmallAlert)

        AlertBlips = {
            big = BigAlert,
            small = SmallAlert
        }
    else    
        if DoesBlipExist(AlertBlips.big) then
            RemoveBlip(AlertBlips.big)
        end

        if DoesBlipExist(AlertBlips.small)  then
            RemoveBlip(AlertBlips.small)
        end

        AlertBlips = {}
    end    
end)

function NoCarryWeapon()
    if GetSelectedPedWeapon(PlayerPedId()) == GetHashKey('WEAPON_UNARMED') then
        return true
    else
        SendNotify(3)
        return false
    end
end

function DisableMinimap()
    DisplayRadar(false)
    -- Here you can add a trigger to hide your HUD system
end

function EnableMinimap()
    DisplayRadar(true)
    -- Here you can add a trigger to enable your HUD system
end
chevron-rightserver-utils.luahashtag
local YourWebhook = 'WEBHOOK-HERE'  -- help: https://docs.brutalscripts.com/site/others/discord-webhook

function GetWebhook()
    return YourWebhook
end

RegisterServerEvent('brutal_train_heist:server:PoliceAlert')
AddEventHandler('brutal_train_heist:server:PoliceAlert', function(type, index, coords)
    local Players = GetPlayersFunction()
	for i = 1, #Players do
        for ii=1, #Config.CopJobs do
            if GetPlayerJob(Players[i]) == Config.CopJobs[ii] then
                TriggerClientEvent('brutal_train_heist:client:PoliceAlert', Players[i], type, index, coords)
            end
        end
	end
end)

function GiveGangRewards(source, job)
    if Config.BrutalGangs and GetResourceState("brutal_gangs") == "started" then 
        local gangname = exports["brutal_gangs"]:GetPlayerGangName(source)

        if gangname then
            exports['brutal_gangs']:AddGangReputation(gangname, 5000)
            exports['brutal_gangs']:AddGangMoney(gangname, 5000)
        end
    end    
end
chevron-rightclient-core.luahashtag
Core = nil

if GetResourceState("es_extended") == "started" then
    local _esx_ = 'new' -- 'new' / 'old'

    if _esx_ then
        Core = exports['es_extended']:getSharedObject()
    else
        while Core == nil do
            TriggerEvent('esx:getSharedObject', function(obj) Core = obj end)
            Citizen.Wait(0)
        end
    end

    LoadedEvent = 'esx:playerLoaded'
    TSCB = Core.TriggerServerCallback

    function GetPlayerJobDatas()
        return Core.GetPlayerData().job
    end

    function GetPlayersFunction()
        return Core.Game.GetPlayers()
    end

    function GetVehiclePropertiesFunction(vehicle)
        return Core.Game.GetVehicleProperties(vehicle)
    end

    function SetVehiclePropertiesFunction(vehicle, properties)
        return Core.Game.SetVehicleProperties(vehicle, properties)
    end

    function GetClosestVehicleFunction(coords, modelFilter)
        return Core.Game.GetClosestVehicle(coords, modelFilter)
    end

elseif GetResourceState("qb-core") == "started" or GetResourceState("qbx_core") == "started" then
    Core = exports['qb-core']:GetCoreObject()

    LoadedEvent = 'QBCore:Client:OnPlayerLoaded'
    TSCB = Core.Functions.TriggerCallback

    function GetPlayerJobDatas()
        return Core.Functions.GetPlayerData().job
    end

    function GetPlayersFunction()
        return Core.Functions.GetPlayers()
    end

    function GetVehiclePropertiesFunction(vehicle)
        return Core.Functions.GetVehicleProperties(vehicle)
    end

    function SetVehiclePropertiesFunction(vehicle, properties)
        return Core.Functions.SetVehicleProperties(vehicle, properties)
    end

    function GetClosestVehicleFunction(coords, modelFilter)
        return Core.Functions.GetClosestVehicle(coords, modelFilter)
    end

end
chevron-rightserver-core.luahashtag
Core = nil

if GetResourceState("es_extended") == "started" then
    local _esx_ = 'new' -- 'new' / 'old'
    
    if _esx_ == 'new' then
        Core = exports['es_extended']:getSharedObject()
    else
        Core = nil
        TriggerEvent('esx:getSharedObject', function(obj) Core = obj end)
        while Core == nil do
            Citizen.Wait(0)
        end
    end

    RESCB = Core.RegisterServerCallback
    GETPFI = Core.GetPlayerFromId
    RUI = Core.RegisterUsableItem

    function GetIdentifier(source)
        local xPlayer = GETPFI(source)
        while xPlayer == nil do
            Citizen.Wait(1000)
            xPlayer = GETPFI(source) 
        end
        return xPlayer.identifier
    end

    function GetPlayerByIdentifier(identifier)
        return Core.GetPlayerFromIdentifier(identifier)
    end

    function AddMoneyFunction(source, amount, type)
        local xPlayer = GETPFI(source)

        if type == 'sell' then
            xPlayer.addAccountMoney('money', amount)  
        else
            xPlayer.addAccountMoney('money', amount)  
        end 
    end

    function GetItemCount(source, item)
        local xPlayer = GETPFI(source)

        if _esx_ == 'new' then
            if xPlayer.getInventoryItem(item) == nil then
                print("^1PROBLEM!^7 The ^3" ..item.. "^7 item is not created.")
                return 0
            end

            return xPlayer.getInventoryItem(item).count
        else
            if string.sub(item, 0, 6):lower() == 'weapon' then
                local loadoutNum, weapon = xPlayer.getWeapon(item:upper())

                if weapon then
                    return true
                else
                    return false
                end
            else
                return xPlayer.getInventoryItem(item).count
            end
        end
    end
    
    function RemoveItem(source, item, amount)
        local xPlayer = GETPFI(source)
        if _esx_ == 'new' then
            xPlayer.removeInventoryItem(item, amount)
        else
            if string.sub(item, 0, 6):lower() == 'weapon' then
                xPlayer.removeWeapon(item)
            else
                xPlayer.removeInventoryItem(item, amount)
            end
        end
    end

    function AddItem(source, item, count, info)
        local xPlayer = GETPFI(source)
        if _esx_ == 'new' then
            xPlayer.addInventoryItem(item, count, info)
        else
            if string.sub(item, 0, 6):lower() == 'weapon' then
                xPlayer.addWeapon(item, 90)
            else
                xPlayer.addInventoryItem(item, count)
            end
        end
    end

    function GetPlayerNameFunction(source)
        local name
        if Config.PlayerIdentityDisplay:lower() == "steam" then
            name = GetPlayerName(source) or 'No Data'
        elseif Config.PlayerIdentityDisplay:lower() == "discord" then
            name = GetDiscordName(source) or 'No Data'
        else
            local xPlayer = GETPFI(source)
            name = xPlayer.getName() or 'No Data'
        end
        return name
    end

    function GetPlayerJob(source)
        local xPlayer = GETPFI(source)
        if xPlayer ~= nil then
            PlayerJob = xPlayer.job.name
        else
            PlayerJob = ''
        end
        return PlayerJob
    end

    function GetPlayersFunction()
        return Core.GetPlayers()
    end

    function GetItemLabel(itemname)
        return Core.GetItemLabel(itemname)
    end

elseif GetResourceState("qb-core") == "started" or GetResourceState("qbx_core") == "started" then

    Core = exports['qb-core']:GetCoreObject()
    
    RESCB = Core.Functions.CreateCallback
    GETPFI = Core.Functions.GetPlayer
    RUI = Core.Functions.CreateUseableItem

    function GetIdentifier(source)
        local xPlayer = GETPFI(source)
        while xPlayer == nil do
            Citizen.Wait(1000)
            xPlayer = GETPFI(source) 
        end
        return xPlayer.PlayerData.citizenid
    end

    function GetPlayerByIdentifier(identifier)
        return Core.Functions.GetPlayerByCitizenId(identifier)
    end

    function AddMoneyFunction(source, amount, type)
        local xPlayer = GETPFI(source)

        if type == 'sell' then
            xPlayer.Functions.AddMoney('cash', amount)
        else
            xPlayer.Functions.AddMoney('cash', amount)
        end    
    end

    function GetItemCount(source, item)
        local xPlayer = GETPFI(source)
        local items = xPlayer.Functions.GetItemByName(item)
        local item_count = 0
        if items ~= nil then
            item_count = items.amount
        else
            item_count = 0
        end
        return item_count
    end

    function RemoveItem(source, item, amount)
        local xPlayer = GETPFI(source)
        xPlayer.Functions.RemoveItem(item, amount)
    end

    function AddItem(source, item, count, info)
        local xPlayer = GETPFI(source)
        xPlayer.Functions.AddItem(item, count, nil, info)
    end

    function GetPlayerNameFunction(source)
        local name
        if Config.PlayerIdentityDisplay:lower() == "steam" then
            name = GetPlayerName(source) or 'No Data'
        elseif Config.PlayerIdentityDisplay:lower() == "discord" then
            name = GetDiscordName(source) or 'No Data'
        else
            local xPlayer = GETPFI(source)
            name = xPlayer.PlayerData.charinfo.firstname..' '..xPlayer.PlayerData.charinfo.lastname 
        end
        return name
    end

    function GetPlayerJob(source)
        local xPlayer = GETPFI(source)
        return xPlayer.PlayerData.job.name
    end

    function GetPlayerGang(source)
        local xPlayer = GETPFI(source)
        return xPlayer.PlayerData.gang.name
    end

    function GetPlayersFunction()
        return Core.Functions.GetPlayers()
    end

    function GetItemLabel(itemname)
        local item = Core.Shared.Items[itemname]
        if item then
            return item.label
        else
            print("^1PROBLEM!^7 The ^3" ..item.. "^7 item is not created.")
        end
    end
end

Last updated