# Accessible files

<details>

<summary>config.lua</summary>

```lua
----------------------------------------------------------------------------------------------
----------------------------------| BRUTAL VEHICLE SHOP :) |----------------------------------
----------------------------------------------------------------------------------------------

--[[

Hi, thank you for buying our script, We are very grateful!

For help join our Discord server:     https://discord.gg/85u2u5c8q9
More informations about the script:   https://docs.brutalscripts.com

--]]

Config = {} -- Don't touch it

Config['Core'] = 'ESX'  -- ESX / QBCore  | Other core setting on the 'core' folder
Config['BrutalNotify'] = true -- Buy here: (4€+VAT) https://store.brutalscripts.com | Or set up your own notify >> cl_utils.lua
Config['BrutalKeys'] = true -- Buy here: (15€+VAT) https://store.brutalscripts.com | Or set up your own vehiclekeys >> cl_utils.lua

-- You can add your own notify here >> cl_utils.lua

Config['VehicleShops'] = {
    -- Discord Webhook config in 'webhook.lua'
    ['MoneyForm'] = '$',  -- Please add your server money form | EXAMPLES: '$', '€', 'Ft', 'Lira', etc.
    ['Plate'] = 'LLL NNN',  -- L = Letter, N = Number, ' ' = SPACE | Maximum 8 character!!! Examples: 'LL NN LL', 'NN', 'LNLN' | Edit as you like
    ['TestDrive'] = {Use = true, price = 5000, time = 60},  -- Test drive config
    ['TestDriveCancel'] = {Use = true, command = 'cancel', Suggestion = 'Use the command to end the test drive'},  -- Testdrive command | true / false | command = 'COMMAND' | Suggestion = Chat label, to turn off: set ''
    ['TestDriveRevive'] = true,  -- Revive a player if he died during vehicle testing
    ['Metric'] = 'KMH', -- KMH / MPH
    ['UseScreenBlur'] = true,  -- true / false | Want to use Screen Blur?
    ['MenuOpenKey'] = 38,  -- More controls: https://docs.fivem.net/docs/game-references/controls/
    ['MaxVehiclesSpeed'] = 400, -- Max speed a vehicle can go at (it is only used for UI purposes, it does NOT change the speed of a vehicle)
    ['ColourExtraMoney'] = 2500, -- PRICE / false | The extra money what you have to pay if your car's color isn't black or white
    
    ['Tunings'] = {  -- Vehicle tunings
        ['Exist'] = true,  -- Want to use? | true / false
        ['Engine'] = {false, 15000, 2},  -- true/false, price/level , The maximum value of tuning you want to be able to put into the vehicle
        ['Brakes'] = {false, 8000, 5},
        ['Turbo'] = {false, 50000},
        ['Xeon'] = {true, 500},
        ['Livery'] = {true, 10000},
    },
    
    ['UseColorGTAID'] = false, -- Will set the vehicle color based on the color ID: https://wiki.rage.mp/index.php?title=Vehicle_Colors
    ['Colours'] = {  -- Vehicle Colours | You can't add more! (Only 10)
        [1] = {255, 255, 255, GTAID = 134},  -- R, G, B, GTA COLOUR | The GTA color is used by the script if ['UseColorGTAID'] is true
        [2] = {0, 0, 0, GTAID = 0},
        [3] = {150, 150, 150, GTAID = 4},      
        [4] = {255, 0, 0, GTAID = 27},
        [5] = {255, 150, 0, GTAID = 41},        
        [6] = {255, 230, 0, GTAID = 89},
        [7] = {0, 255, 0, GTAID = 55},          
        [8] = {0, 0, 255, GTAID = 79},
        [9] = {76, 0, 255, GTAID = 145},         
        [10] = {255, 0, 255, GTAID = 137},
    },
    
    ['Shops'] = {
        --------------------------------------------------------------------------
        -----------------------------| VEHICLE SHOP |-----------------------------
        --------------------------------------------------------------------------

        ['Vehicle Shop'] = {
            ['Use'] = true,  -- Want to use this shop? | true / false
            ['Coords'] = { x = -43.0507, y = -1104.0652, z = 26.4223}, -- Shop possition
            ['TextDistance'] = 1.3,  -- Open Menu Distance
            ['Marker'] = {Distance = 15, Sprite = 36, Rotation = true, UpAndDown = false, Brightness = 100, r = 260, g = 40, b = 40},  -- More sprites: https://docs.fivem.net/docs/game-references/markers/
            ['Cam'] = {x = -46.4095, y = -1102.0146, z = 27.2223, rotation = {-15.0,0.0,-20} },  -- Shop camera position
            ['PreviewVehicle'] = {x = -44.4230, y = -1096.9951, z = 26.4223, heading = 158.5431-45},  -- Preview vehicle position
            ['SpawnCoords'] = {x = -24.8248, y = -1082.5984, z = 26.6334, heading = 70.1315},  -- Vehicle Spawn Coords
            ['TestCoords'] = {x = -1695.7524, y = -2840.3235, z = 13.9444, heading = 328.2468},  -- Vehicle Test Coords
            ['Blip'] = {Use = true, colour = 0, label = 'Vehicle Shop', size = 0.8, sprite = 225 }, -- Blip config
            ['SeveralCategorys'] = true,  -- Want to use Categorys in this Shop? | true / false (If false, the first category will appear only)
            ['Caregorys'] = {  -- You can add endless amount of cagerorys
                {
                    title = "Super Sport",  -- Category name
                    vehicles = {
                        {model = "adder", label = "Adder", price = 900000, type = 'car'},  -- model = vehicle model, label = Vehicle Label, price = Vehicle Price, type = Vehicle type ('boat', 'car', 'heli', 'plane', etc.)
                        {model = "zentorno", label = "Zentorno", price = 765000, type = 'car'},
                        {model = "cheetah", label = "Cheetah", price = 375000, type = 'car'},
                        {model = "zeno", label = "Zeno", price = 560000, type = 'car'},
                        {model = "visione", label = "Visione", price = 640000, type = 'car'},
                        {model = "champion", label = "Champion", price = 200000, type = 'car'},
                        {model = "ignus", label = "Ignus", price = 330000, type = 'car'},
                        {model = "tigon", label = "Tigon", price = 265000, type = 'car'},
                        {model = "furia", label = "Furia", price = 399000, type = 'car'},
                        {model = "krieger", label = "Krieger", price = 534000, type = 'car'},
                        {model = "emerus", label = "Emerus", price = 760000, type = 'car'},
                        {model = "thrax", label = "Thrax", price = 1000000, type = 'car'},
                        {model = "autarch", label = "Autarch", price = 1500000, type = 'car'},
                        {model = "vagner", label = "Vagner", price = 489000, type = 'car'},
                        {model = "tempesta", label = "Tempesta", price = 345000, type = 'car'},
                        {model = "tyrus", label = "Tyrus", price = 850000, type = 'car'},
                        {model = "reaper", label = "Reaper", price = 120000, type = 'car'},
                        {model = "fmj", label = "FMJ", price = 280000, type = 'car'},
                        {model = "t20", label = "T20", price = 530000, type = 'car'},
                        {model = "osiris", label = "Osiris", price = 267000, type = 'car'},
                        {model = "banshee", label = "Banshee", price = 150000, type = 'car'},
                        {model = "vacca", label = "Vacca", price = 270000, type = 'car'},
                        {model = "infernus", label = "Infernus", price = 190000, type = 'car'}

                    }
                },
                {
                    title = "Sedans",
                    vehicles = {
                        {model = "ingot", label = "Ingot", price = 13400, type = 'car'},
                        {model = "premier", label = "Premier", price = 23000, type = 'car'},
                        {model = "regina", label = "Regina", price = 16000, type = 'car'},
                    }
                },
                {
                    title = "Compats",
                    vehicles = {
                        {model = "asbo", label = "Asbo", price = 8000, type = 'car'},
                        {model = "hellion", label = "Hellion", price = 29000, type = 'car'},
                    }
                },
                {
                    title = "Muscle",
                    vehicles = {
                        {model = "vamos", label = "Vamos", price = 50000, type = 'car'},
                    }
                },
                {
                    title = "Suvs",
                    vehicles = {
                        {model = "rocoto", label = "Rocoto", price = 76000, type = 'car'},
                        {model = "mesa", label = "Mesa", price = 100000, type = 'car'},
                    }
                },
                {
                    title = "Off Road",
                    vehicles = {
                        {model = "brawler", label = "Brawler", price = 99000, type = 'car'},
                        {model = "guardian", label = "Guardian", price = 160000, type = 'car'},
                    }
                },
                {
                    title = "Vans",
                    vehicles = {
                        {model = "speedo", label = "Speedo", price = 70000, type = 'car'},
                    }
                },
                -- You can add more categorys...
            }
        },
        --------------------------------------------------------------------------
        ------------------------------| BOAT SHOP |-------------------------------
        --------------------------------------------------------------------------
        ['Boat Shop'] = {
            ['Use'] = true,
            ['Coords'] = { x = -713.2616, y = -1297.8879, z = 5.1019},
            ['TextDistance'] = 1.3,
            ['Marker'] = {Distance = 15, Sprite = 35, Rotation = true, UpAndDown = false, Brightness = 100, r = 260, g = 40, b = 40},
            ['Cam'] = {x = -729.3079, y = -1357.8542, z = 4.9027, rotation = {-15.0,0.0,-40} },
            ['PreviewVehicle'] = {x = -719.5148, y = -1347.1199, z = 0.5714, heading = 140.7528-45},
            ['SpawnCoords'] = {x = -723.5148, y = -1351.1199, z = 0.5714, heading = 140.7528},
            ['TestCoords'] = {x = -853.1735, y = -1544.8879, z = 0.6218, heading = 135.6689},
            ['Blip'] = {Use = true, colour = 0, label = 'Boat Shop', size = 0.8, sprite = 427 },
            ['SeveralCategorys'] = false, 
            ['Caregorys'] = {
                {
                    title = "Boats",
                    vehicles = {
                        {model = "seashark", label = "Seashark", price = 160000, type = 'boat'},
                        {model = "speeder", label = "Speeder", price = 230000, type = 'boat'},
                        {model = "dinghy", label = "Dinghy", price = 340000, type = 'boat'},
                        {model = "toro", label = "Toro", price = 2000000, type = 'boat'},
                    }
                },
            }
        },
        --------------------------------------------------------------------------
        -----------------------| PLANE AND HELICOPTER SHOP |----------------------
        --------------------------------------------------------------------------
        ['Plane & Helicopter Shop'] = {
            ['Use'] = true,
            ['Coords'] = { x = -711.2363, y = -1459.9780, z = 5.0005},
            ['TextDistance'] = 1.3,
            ['Marker'] = {Distance = 15, Sprite = 34, Rotation = true, UpAndDown = false, Brightness = 100, r = 260, g = 40, b = 40},
            ['Cam'] = {x = -718.8840, y = -1436.9779, z = 7.0005, rotation = {-17.0,0.0,140} },
            ['PreviewVehicle'] = {x = -724.7278, y = -1444.2869, z = 5.0005, heading = 320.7925-45},
            ['SpawnCoords'] = {x = -750.1570, y = -1444.5887, z = 5.0005, heading = 228.2726},
            ['TestCoords'] = {x = -745.8632, y = -1469.1633, z = 5.0004, heading = 323.0506},
            ['Blip'] = {Use = true, colour = 0, label = 'Plane & Helicopter Shop', size = 0.8, sprite = 64 },
            ['SeveralCategorys'] = false,
            ['Caregorys'] = {
                {
                    title = "Plane & Helicopter",
                    vehicles = {
                        {model = "volatus", label = "Volatus", price = 10000000, type = 'heli'},
                        {model = "havok", label = "Havok", price = 4900000, type = 'heli'},
                    }
                },
            }
        },

        -- You can add more Shop
    },

    ['UseVehicleSell'] = true,  -- Want to use the Vehicle Sell function? true / false
    ['VehicleSellPercentage'] = 50,

    --------------------------------------------------------------------------
    ------------------------------| TRANSLATE |-------------------------------
    --------------------------------------------------------------------------

    ['OpenShop'] = 'Press [E] to Open Menu',

    ['TestNotify'] = {'Vehicle Test', 'You have', 'second to test the Vehicle!', 'Cancel command: /'},
    ['BuyNotify'] = {'Vehicle Purchase', 'You have bought a(n)', 'with', 'plate!'},
    ['SellNotify'] = {'Get in that vehicle which you want to sell<br>You have 30 sec to get in the vehicle!'},

    ['Notify'] = { 
        [1] = {"Vehicle Shop", "You don't have enought money!", 5000, "error"},  -- Type, Label, Time | 1000 = 1 sec
        [2] = {"Vehicle Shop", "The spawn space is not empty!", 5000, "error"},
        [3] = {"Vehicle Shop", "You are already testing a vehicle!", 5000, "error"},
        [4] = {"Vehicle Shop", "This vehicle model does not exist!", 5000, "error"},
        [5] = {"Vehicle Shop", "This is not your vehicle!", 5000, "error"},
        [6] = {"Vehicle Shop", "You have successfully sold your vehicle!", 5000, "success"},
        [7] = {"Vehicle Shop", "You can't be in the vehicle!", 5000, "error"},
    },
}
```

</details>

<details>

<summary>client-utils.lua</summary>

```lua
function notification(title, text, time, type) -- Buy here: (4€+VAT) https://store.brutalscripts.com
    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

RegisterNetEvent('brutal_vehicleshop:client:buyvehicle_utils')
AddEventHandler('brutal_vehicleshop:client:buyvehicle_utils', function(Vehicle, Plate, Model, Price, Label)
    SetVehicleMaxFuel(Vehicle)  -- Our special function
    -- You can add more function and trigger
end)

RegisterNetEvent('brutal_vehicleshop:client:GiveKeys')
AddEventHandler('brutal_vehicleshop:client:GiveKeys', function(vehicle, plate)
	-- Leave blank if you have no keys to give
	Citizen.Wait(1000)
	if Config['BrutalKeys'] and GetResourceState("brutal_keys") == "started" then exports.brutal_keys:addVehicleKey(plate, plate) end	

	--TriggerEvent('vehiclekeys:client:SetOwner', plate)  -- for QBCore (if not work, we can't help you with this)
end)

RegisterNetEvent('brutal_vehicleshop:client:GiveKeysTestDrive')
AddEventHandler('brutal_vehicleshop:client:GiveKeysTestDrive', function(vehicle, plate)
	-- Leave blank if you have no keys to give
    if Config['BrutalKeys'] and GetResourceState("brutal_keys") == "started" then exports.brutal_keys:addVehicleTemporaryKey(Config['VehicleShops']['TestDrive']['time'], plate, plate) end
	
	--TriggerEvent('vehiclekeys:client:SetOwner', plate)  -- for QBCore (if not work, we can't help you with this)
end)

RegisterNetEvent('brutal_vehicleshop:client:onMenuOpen')
AddEventHandler('brutal_vehicleshop:client:onMenuOpen', function()
	-- Code to execute when the player opens the vehicle shop
end)

RegisterNetEvent('brutal_vehicleshop:client:onMenuClose')
AddEventHandler('brutal_vehicleshop:client:onMenuClose', function()
	-- Code to execute when the player leaves the vehicle shop
end)

RegisterNetEvent('brutal_vehicleshop:client:onStartTestDrive')
AddEventHandler('brutal_vehicleshop:client:onStartTestDrive', function(vehicle)
	-- Code to execute when the player starts the test drive
end)

RegisterNetEvent('brutal_vehicleshop:client:onFinishTestDrive')
AddEventHandler('brutal_vehicleshop:client:onFinishTestDrive', function(vehicle)
	-- Code to execute when the player finishes the test drive
end)

RegisterNetEvent('brutal_vehicleshop:client:onSellVehicle')
AddEventHandler('brutal_vehicleshop:client:onSellVehicle', function(vehicle)
	if Config['BrutalKeys'] and GetResourceState("brutal_keys") == "started" then 
		local plate = GetVehicleNumberPlateText(vehicle)
		exports.brutal_keys:removeKey(plate, true) 
	end	
	DeleteEntity(vehicle)
	-- Code to execute when a vehicle is sold
end)

function SetVehicleMaxFuel(vehicle)  -- It fills the car's tank
    SetVehicleFuelLevel(vehicle, 100.0)
    DecorSetFloat(vehicle, "_FUEL_LEVEL", GetVehicleFuelLevel(vehicle))
end

function GPS_Enable()  -- if you don't want to use, comment out the line
    DisplayRadar(true)
end

function GPS_Disable()  -- if you don't want to use, comment out the line
    DisplayRadar(false)
end

function BuyAnimation()  -- Vehicle Buy animation
	local PP = PlayerPedId()
	FreezeEntityPosition(PP, true)
	local ad = "missheistdockssetup1clipboard@base"  
	local prop_name = 'prop_notepad_01'
	local secondaryprop_name = 'prop_pencil_01'
	loadAnimDict(ad)

	if not IsEntityDead(PP) then
		local x,y,z = table.unpack(GetEntityCoords(PP))
		prop = CreateObject(GetHashKey(prop_name), x, y, z+0.2,  true,  true, true)
		secondaryprop = CreateObject(GetHashKey(secondaryprop_name), x, y, z+0.2,  true,  true, true)
		AttachEntityToEntity(prop, PP, GetPedBoneIndex(PP, 18905), 0.1, 0.02, 0.05, 10.0, 0.0, 0.0, true, true, false, true, 1, true)
		AttachEntityToEntity(secondaryprop, PP, GetPedBoneIndex(PP, 58866), 0.12, 0.0, 0.001, -150.0, 0.0, 0.0, true, true, false, true, 1, true)
		TaskPlayAnim(PP, ad, "base", 8.0, 1.0, -1, 49, 0, 0, 0, 0)
		Citizen.Wait(5000)
		FreezeEntityPosition(PP, false)
		ClearPedSecondaryTask(PP)
		DetachEntity(prop, 1, 1)
		DeleteObject(prop)
		DetachEntity(secondaryprop, 1, 1)
		DeleteObject(secondaryprop)
	end
end
```

</details>

<details>

<summary>server-utils.lua</summary>

```lua
local YourWebhook = 'WEBHOOK-HERE'  -- help: https://docs.brutalscripts.com/site/others/discord-webhook

function GetWebhook()
    return YourWebhook
end

RegisterNetEvent('brutal_vehicleshop:server:buyvehicle_utils')
AddEventHandler('brutal_vehicleshop:server:buyvehicle_utils', function(Vehicle, Plate, Model, Price, Label)
    SendDiscord('VEHICLE BOUGHT', '**Player:** '.. source ..' ['.. GetIdentifier(source) ..']\n**Vehicle:** '.. Label ..' ['.. Model ..']\n**Plate:** '.. Plate ..'\n**Price:** '.. Price ..' '.. Config['VehicleShops']['MoneyForm'] ..'\n\nPlayer bought a vehicle!', 1)
    -- You can add more function and trigger
end)

----------------------------------------------------------------------------------------------------------
--------------------------------------------------| SQL |-------------------------------------------------
----------------------------------------------------------------------------------------------------------

SoldVehicles = {}

if Config['Core'] == 'ESX' then
--------------------------------------------------------------------------
---------------------------------| ESX |----------------------------------
--------------------------------------------------------------------------

    RESCB('brutal_vehicleshop:server:isPlateTaken', function(source, cb, plate)
        MySQL.scalar('SELECT plate FROM owned_vehicles WHERE plate = ?', {plate},
        function(result)
            cb(result ~= nil)
        end)
    end)

    RegisterNetEvent('brutal_vehicleshop:server:InsertVehicle')
    AddEventHandler('brutal_vehicleshop:server:InsertVehicle', function(vehicle, plate, model, hash, vehicleProps, vehtype)
        MySQL.insert('INSERT INTO owned_vehicles (owner, plate, vehicle, type) VALUES (?, ?, ?, ?)', {
            GetIdentifier(source), 
            plate, 
            json.encode(vehicleProps),
            vehtype
        }, function(rowsChanged) end)
    end)

    RESCB('brutal_vehicleshop:server:CheckPlayerOwned', function(source, cb, modelhash, model, plate, price)
        MySQL.single('SELECT * FROM owned_vehicles WHERE owner = ? AND plate = ?', {GetIdentifier(source), plate},
        function(result)
            if result then
                
                if json.decode(result.vehicle).model == model or json.decode(result.vehicle).model == modelhash then
                    if string.gsub(json.decode(result.vehicle).plate, '%s+', '') == string.gsub(plate, '%s+', '') then
                        MySQL.update('DELETE FROM owned_vehicles WHERE plate = ?', {plate})
                        SendDiscord('VEHICLE SELLED', '**Player:** '.. source ..' ['.. GetIdentifier(source) ..']\n**Plate:** '.. plate ..' \n**Model:** '.. model ..'\n**For that price:** '.. price ..' '.. Config['VehicleShops']['MoneyForm'] ..'\n\nThe player has sold his vehicle!', 2)
                        table.insert(SoldVehicles, plate)
                        cb(true)
                    else
                        SendDiscord('HACKER', '**Player:** '.. source ..' ID ['.. GetIdentifier(source) ..']\n**Reason:** Attempted To Resell Vehicle With Invalid Plate\nTried to make a lot of money', 3)
                        cb(false)
                    end
                else
                    SendDiscord('HACKER', '**Player:** '.. source ..' ID ['.. GetIdentifier(source) ..']\n**Reason:** Attempted To Resell Vehicle With Invalid Model\nTried to make a lot of money', 3)
                    cb(false)
                end
            else
                cb(false)
            end
        end)
    end)

elseif Config['Core'] == 'QBCore' then
--------------------------------------------------------------------------
--------------------------------| QBCore |--------------------------------
--------------------------------------------------------------------------
    RESCB('brutal_vehicleshop:server:isPlateTaken', function(source, cb, plate)
        MySQL.scalar('SELECT plate FROM player_vehicles WHERE plate = ?', {plate},
        function(result)
            cb(result ~= nil)
        end)
    end)
    
    RegisterNetEvent('brutal_vehicleshop:server:InsertVehicle')
    AddEventHandler('brutal_vehicleshop:server:InsertVehicle', function(vehicle, plate, model, hash, vehicleProps, vehtype)
        MySQL.insert('INSERT INTO player_vehicles (license, citizenid, vehicle, hash, mods, plate, garage, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', {
            GetIdentifier(source),
            GetCitizenID(source),
            model,
            hash,
            json.encode(vehicleProps),
            plate,
            'pillboxgarage',
            0
        })
    end)
    
    RESCB('brutal_vehicleshop:server:CheckPlayerOwned', function(source, cb, modelhash, model, plate, price)
        MySQL.single('SELECT * FROM player_vehicles WHERE license = ? AND plate = ?', {GetIdentifier(source), plate},
        function(result)
            if result then

                if result.vehicle == model or result.hash == string.gsub(modelhash, '%s+', '') then
                    if string.gsub(result.plate, '%s+', '') == string.gsub(plate, '%s+', '') then
                        MySQL.update('DELETE FROM player_vehicles WHERE plate = ?', {plate})
                        SendDiscord('VEHICLE SELLED', '**Player:** '.. source ..' ['.. GetIdentifier(source) ..']\n**Plate:** '.. plate ..' \n**Model:** '.. model ..'\n**For that price:** '.. price ..' '.. Config['VehicleShops']['MoneyForm'] ..'\n\nThe player has sold his vehicle!', 2)
                        table.insert(SoldVehicles, plate)
                        cb(true)
                    else
                        SendDiscord('HACKER', '**Player:** '.. source ..' ID ['.. GetIdentifier(source) ..']\n**Reason:** Attempted To Resell Vehicle With Invalid Plate\nTried to make a lot of money', 3)
                        cb(false)
                    end
                else
                    SendDiscord('HACKER', '**Player:** '.. source ..' ID ['.. GetIdentifier(source) ..']\n**Reason:** Attempted To Resell Vehicle With Invalid Model\nTried to make a lot of money', 3)
                    cb(false)
                end
            else
                cb(false)
            end
        end)
    end)

end
```

</details>

<details>

<summary>client-core.lua</summary>

```lua
Core = nil

if Config['Core'] == 'ESX' then
    
    Core = exports['es_extended']:getSharedObject()

    LoadedEvent = 'esx:playerLoaded'
    ReviveEvent = 'esx_ambulancejob:revive'
    PlayerDiedHealth = 0
    TSCB = Core.TriggerServerCallback

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

elseif Config['Core'] == 'QBCore' then

    Core = exports['qb-core']:GetCoreObject()
    
    LoadedEvent = 'QBCore:Client:OnPlayerLoaded'
    ReviveEvent = 'hospital:client:Revive'
    PlayerDiedHealth = 150
    TSCB = Core.Functions.TriggerCallback

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

end
```

</details>

<details>

<summary>server-core.lua</summary>

```lua
Core = nil

if Config['Core'] == 'ESX' then
--------------------------------------------------------------------------
---------------------------------| ESX |----------------------------------
--------------------------------------------------------------------------

    Core = exports['es_extended']:getSharedObject()

    RESCB = Core.RegisterServerCallback
    GETPFI = Core.GetPlayerFromId
    RUI = Core.RegisterUsableItem
    Accounts = {'money', 'bank'}

    function GetIdentifier(xPlayer)
        if type(xPlayer) == 'number' then
            local xPlayer = GETPFI(xPlayer)
            return xPlayer.identifier
        else
            return xPlayer.identifier
        end
    end

    function GetAccountMoney(xPlayer,account)
        return xPlayer.getAccount(account).money
    end

    function RemoveAccountMoney(xPlayer, account, amount)
        xPlayer.removeAccountMoney(account, amount)
    end

    function AddAccountMoney(xPlayer, account, amount)
        xPlayer.addAccountMoney(account, amount)
    end

elseif Config['Core'] == 'QBCore' then
--------------------------------------------------------------------------
--------------------------------| QBCore |--------------------------------
--------------------------------------------------------------------------

    Core = exports['qb-core']:GetCoreObject()
    
    RESCB = Core.Functions.CreateCallback
    GETPFI = Core.Functions.GetPlayer
    RUI = Core.Functions.CreateUseableItem
    Accounts = {'cash', 'bank'}

    function GetIdentifier(xPlayer)
        if type(xPlayer) == 'number' then
            local xPlayer = GETPFI(xPlayer)
            return xPlayer.PlayerData.license
        else
            return xPlayer.PlayerData.license
        end
    end

    function GetCitizenID(xPlayer)
        if type(xPlayer) == 'number' then
            local xPlayer = GETPFI(xPlayer)
            return xPlayer.PlayerData.citizenid
        else
            return xPlayer.PlayerData.citizenid
        end
    end

    function GetAccountMoney(xPlayer, account)
        if account == Accounts[1] then
            return xPlayer.PlayerData.money['cash']
        elseif account == Accounts[2] then
            return xPlayer.PlayerData.money['bank']
        end
    end

    function RemoveAccountMoney(xPlayer, account, amount)
        xPlayer.Functions.RemoveMoney(account, amount)
    end

    function AddAccountMoney(xPlayer, account, amount)
        xPlayer.Functions.AddMoney(account, amount)
    end
    
end
```

</details>


---

# 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.brutalscripts.com/site/scripts/vehicle-shop/accessible-files.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.
