# About Us

We are a duo team of developers who specialize in the creation and distribution of **affordable**, yet **high-end quality** FiveM resources.

We're proud to say that over the course of a year, we've managed to establish our name and earn a positive name within the FiveM community.

With over **25.000** members in our discord server and thousands of satisfied customers, our primary goal is listening to the feedback of our community, taking in their suggestions and creating scripts which will reach the vast majority audience within FiveM. As well as updating our already released scripts on a frequent basis, implementing community suggestions, always improving and optimizing.


# okokBankingV2

[**YouTube Video**](https://www.youtube.com/watch?v=-bC489zMaZI)

## Installation Guide

### Requirements

ox\_lib **v3.16.2+** (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>);

#### Execute the following SQL code in your database:

{% tabs %}
{% tab title="ESX" %}

```sql
ALTER TABLE `users`
    ADD COLUMN IF NOT EXISTS `iban` VARCHAR(32) NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `okok_pincode` LONGTEXT NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `okok_credit_score` INT(11) NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `okok_bank_contacts` TEXT NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `opening_date` LONGTEXT NULL DEFAULT NULL;

ALTER TABLE `users` ADD INDEX `idx_users_iban` (`iban`);

CREATE TABLE IF NOT EXISTS `okokbanking_societies` (
    `society` VARCHAR(255) NULL DEFAULT NULL,
    `society_name` VARCHAR(255) NULL DEFAULT NULL,
    `value` INT(50) NULL DEFAULT NULL,
    `iban` VARCHAR(32) NOT NULL,
    `pincode` JSON NULL DEFAULT NULL,
    `credit_score` INT(11) NULL DEFAULT NULL,
    `opening_date` LONGTEXT NULL DEFAULT NULL
);

ALTER TABLE `okokbanking_societies`
    ADD COLUMN IF NOT EXISTS `pincode` JSON NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `credit_score` INT(11) NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `okok_bank_contacts` TEXT NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `opening_date` LONGTEXT NULL DEFAULT NULL;

CREATE TABLE IF NOT EXISTS `okokbanking_accounts` (
    `account_holder` VARCHAR(64) NULL DEFAULT NULL,
    `account_identifier` VARCHAR(64) NULL DEFAULT NULL,
    `account_name` VARCHAR(100) NULL DEFAULT NULL,
    `owner_name` VARCHAR(100) NULL DEFAULT NULL,
    `balance` INT(50) NULL DEFAULT NULL,
    `iban` VARCHAR(32) NULL DEFAULT NULL,
    `pincode` JSON NULL DEFAULT NULL,
    `account_type` VARCHAR(50) NULL DEFAULT NULL,
    `daily_avg` LONGTEXT NULL DEFAULT NULL,
    `interest_total` BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `okok_credit_score` INT(11) NULL DEFAULT NULL,
    `opening_date` LONGTEXT NULL DEFAULT NULL,
    INDEX `idx_okok_acc_type` (`account_type`, `account_holder`),
    UNIQUE KEY `idx_account_identifier` (`account_identifier`)
);

CREATE TABLE IF NOT EXISTS `okokbanking_loans` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `identifier` VARCHAR(64) NOT NULL,
    `label` VARCHAR(64) NOT NULL,
    `contract_total` INT UNSIGNED NOT NULL,
    `months` SMALLINT UNSIGNED NOT NULL,
    `monthly_payment` INT UNSIGNED NOT NULL,
    `months_paid` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
    `paid` INT UNSIGNED NOT NULL DEFAULT 0,
    `next_due_at` INT UNSIGNED NOT NULL,
    `grace_ends_at` INT UNSIGNED NULL DEFAULT NULL,
    `status` TINYINT UNSIGNED NOT NULL DEFAULT 0,
    INDEX `idx_okb_loans_cid_status_due` (`identifier`, `status`, `next_due_at`),
    INDEX `idx_okb_loans_status_next` (`status`, `next_due_at`),
    INDEX `idx_okb_loans_grace` (`grace_ends_at`, `status`),
    INDEX `idx_okb_loans_payment` (`status`, `next_due_at`)
);

CREATE TABLE IF NOT EXISTS `okokbanking_savinggoals` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `account_holder` VARCHAR(64) NOT NULL,
    `account_identifier` VARCHAR(64) NOT NULL,
    `goal_name` VARCHAR(100) NOT NULL,
    `target_amount` INT UNSIGNED NOT NULL,
    `balance` INT UNSIGNED NOT NULL DEFAULT 0,
    `interest_total` BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `daily_avg` LONGTEXT NULL DEFAULT NULL,
    `is_completed` BOOLEAN NOT NULL DEFAULT FALSE,
    `created_at` INT UNSIGNED NOT NULL,
    `completed_at` INT UNSIGNED NULL DEFAULT NULL,
    INDEX `idx_okok_goals_account_holder` (`account_holder`, `is_completed`),
    INDEX `idx_okok_goals_account_id` (`account_identifier`, `is_completed`),
    INDEX `idx_okok_goals_completed` (`is_completed`)
);

CREATE TABLE IF NOT EXISTS `okokbanking_account_users` (
    `citizenid` VARCHAR(64) NOT NULL PRIMARY KEY,
    `accounts` JSON NOT NULL DEFAULT '{}'
);

ALTER TABLE `users`
    MODIFY COLUMN `opening_date` LONGTEXT NULL DEFAULT NULL;

ALTER TABLE `okokbanking_societies`
    MODIFY COLUMN `opening_date` LONGTEXT NULL DEFAULT NULL;

ALTER TABLE `okokbanking_accounts`
    MODIFY COLUMN `opening_date` LONGTEXT NULL DEFAULT NULL;
```

{% endtab %}

{% tab title="QBCore" %}

```sql
ALTER TABLE `players`
    ADD COLUMN IF NOT EXISTS `pincode` LONGTEXT NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `okok_credit_score` INT(11) NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `okok_bank_contacts` TEXT NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `opening_date` LONGTEXT NULL DEFAULT NULL;

CREATE TABLE IF NOT EXISTS `okokbanking_societies` (
    `society` VARCHAR(255) NULL DEFAULT NULL,
    `society_name` VARCHAR(255) NULL DEFAULT NULL,
    `value` INT(50) NULL DEFAULT NULL,
    `iban` VARCHAR(32) NOT NULL,
    `pincode` JSON NULL DEFAULT NULL,
    `credit_score` INT(11) NULL DEFAULT NULL,
    `opening_date` LONGTEXT NULL DEFAULT NULL
);

ALTER TABLE `okokbanking_societies`
    ADD COLUMN IF NOT EXISTS `pincode` JSON NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `credit_score` INT(11) NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `okok_bank_contacts` TEXT NULL DEFAULT NULL,
    ADD COLUMN IF NOT EXISTS `opening_date` LONGTEXT NULL DEFAULT NULL;

CREATE TABLE IF NOT EXISTS `okokbanking_accounts` (
    `account_holder` VARCHAR(64) NULL DEFAULT NULL,
    `account_identifier` VARCHAR(64) NULL DEFAULT NULL,
    `account_name` VARCHAR(100) NULL DEFAULT NULL,
    `owner_name` VARCHAR(100) NULL DEFAULT NULL,
    `balance` INT(50) NULL DEFAULT NULL,
    `iban` VARCHAR(32) NULL DEFAULT NULL,
    `pincode` JSON NULL DEFAULT NULL,
    `account_type` VARCHAR(50) NULL DEFAULT NULL,
    `daily_avg` LONGTEXT NULL DEFAULT NULL,
    `interest_total` BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `okok_credit_score` INT(11) NULL DEFAULT NULL,
    `opening_date` LONGTEXT NULL DEFAULT NULL,
    INDEX `idx_okok_acc_type` (`account_type`, `account_holder`),
    UNIQUE KEY `idx_account_identifier` (`account_identifier`)
);

CREATE TABLE IF NOT EXISTS `okokbanking_loans` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `identifier` VARCHAR(64) NOT NULL,
    `label` VARCHAR(64) NOT NULL,
    `contract_total` INT UNSIGNED NOT NULL,
    `months` SMALLINT UNSIGNED NOT NULL,
    `monthly_payment` INT UNSIGNED NOT NULL,
    `months_paid` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
    `paid` INT UNSIGNED NOT NULL DEFAULT 0,
    `next_due_at` INT UNSIGNED NOT NULL,
    `grace_ends_at` INT UNSIGNED NULL DEFAULT NULL,
    `status` TINYINT UNSIGNED NOT NULL DEFAULT 0,
    INDEX `idx_okb_loans_cid_status_due` (`identifier`, `status`, `next_due_at`),
    INDEX `idx_okb_loans_status_next` (`status`, `next_due_at`),
    INDEX `idx_okb_loans_grace` (`grace_ends_at`, `status`),
    INDEX `idx_okb_loans_payment` (`status`, `next_due_at`)
);

CREATE TABLE IF NOT EXISTS `okokbanking_savinggoals` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `account_holder` VARCHAR(64) NOT NULL,
    `account_identifier` VARCHAR(64) NOT NULL,
    `goal_name` VARCHAR(100) NOT NULL,
    `target_amount` INT UNSIGNED NOT NULL,
    `balance` INT UNSIGNED NOT NULL DEFAULT 0,
    `interest_total` BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `daily_avg` LONGTEXT NULL DEFAULT NULL,
    `is_completed` BOOLEAN NOT NULL DEFAULT FALSE,
    `created_at` INT UNSIGNED NOT NULL,
    `completed_at` INT UNSIGNED NULL DEFAULT NULL,
    INDEX `idx_okok_goals_account_holder` (`account_holder`, `is_completed`),
    INDEX `idx_okok_goals_account_id` (`account_identifier`, `is_completed`),
    INDEX `idx_okok_goals_completed` (`is_completed`)
);

CREATE TABLE IF NOT EXISTS `okokbanking_account_users` (
    `citizenid` VARCHAR(64) NOT NULL PRIMARY KEY,
    `accounts` JSON NOT NULL DEFAULT '{}'
);

ALTER TABLE `players`
    MODIFY COLUMN `opening_date` LONGTEXT NULL DEFAULT NULL;

ALTER TABLE `okokbanking_societies`
    MODIFY COLUMN `opening_date` LONGTEXT NULL DEFAULT NULL;

ALTER TABLE `okokbanking_accounts`
    MODIFY COLUMN `opening_date` LONGTEXT NULL DEFAULT NULL;
```

{% endtab %}
{% endtabs %}

### QBCORE ONLY

Navigate to **qb-core/server/player.lua** and add the following code underneath **`function self.Functions.SetJobDuty(onDuty) ... end`**:

```lua
self.Functions.ChangeIban = function(iban)
    self.PlayerData.charinfo.account = iban
    self.Functions.UpdatePlayerData()
end
```

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Debug = {
    ["global"] = false,
    ["savings"] = false,
    ["loans"] = false,
    ["sql"] = false,
}

Config.Locale = 'en'                 -- en / pt / gr / fr / de

Config.Currency = 'EUR'              -- auto-format any world currency (EUR, USD, GBP, etc.)
Config.UseSteamNames = false

-- Notifications / UI
-- Config.okokNotify: true = use okokNotify | false = use native framework notification (QBCore.Functions.Notify)
Config.okokNotify = true
-- Config.okokTextUI: true = use okokTextUI | false = use native framework text UI (QBCore DrawText)
Config.okokTextUI = true

-- Input / Target
Config.Key = 38                      -- https://docs.fivem.net/docs/game-references/controls/#controls
Config.UseTargetOnAtm = false        -- use target system instead of TextUI on ATMs
Config.UseTargetOnBank = false       -- use target system instead of TextUI on Banks
Config.TargetSystem = 'ox-target'    -- ox-target
Config.TargetBankDistance = 1.5      -- target distance for banks
Config.DebugTargetZones = false      -- show target zone boxes for debugging

-- okokBilling integration (works with both frameworks)
Config.okokBilling = {
    enable = true,                  -- true = okokBilling | false = no bills system
    resource = "okokBilling",       -- only change if you renamed the resource (https://okok.tebex.io/package/5246435)
}

-- Society integration
Config.UseAddonAccount = false
Config.SocietyResource = "okokBanking" -- okokBanking / esx_addonaccount (set Config.UseAddonAccount = true)

-- IBAN / Account settings
Config.IBANPrefix = "OK"
Config.IBANNumbers = 6
Config.CustomIBANMaxChars = 10
Config.CustomIBANAllowLetters = true
Config.IBANChangeCost = 200
Config.PINChangeCost = 200
Config.PrintReceiptPrice = 100
Config.NewAccountCost = 500          -- Cost to create a new account

-- Transactions only influence loading time, not UI responsiveness
-- New approach tested with 50k transactions, ~5 seconds to load bank, UI is instant
Config.MaxTransactionsPerPlayer = nil   -- nil = unlimited | 100 = 100 transactions 

Config.ShowBankBlips = true             -- show bank blips on the map

Config.InventoryWithMetadata = false
Config.InventoryResource = "ox-inventory"
Config.ReceiptItem = "printerdocument"  -- item name for the receipt

-- =========================
-- TRANSFER CONTACTS SETTINGS
-- =========================

Config.MaxTransferContactsFavorites = 3

-- =========================
-- CUSTOM ACCOUNTS SETTINGS
-- =========================
Config.CustomAccounts = {
    Enabled = true,
    MaxAccountsPerPlayer = 3,   -- Maximum custom accounts a player can own
    CreationFee = 500,          -- Cost to create a custom account
}

-- =========================
-- CARDS SETTINGS
-- =========================
-- EnableCards = true:  Multiple cards per account with physical inventory items
-- EnableCards = false: Max 1 ACTIVE card per account stored in database (no inventory items)
--                      Uses MaxTotalCreditCards for total cards (including blocked), allows new card if no active card exists

Config.EnableCards = false
Config.CreditCardPrice = 300            -- cost to create a card
Config.CreditCardActivationFee = 200    -- fee to activate the card
Config.CreditCardRenewalFee = 100       -- fee to renew the card
Config.RenewCardTime = 8                -- time in days to renew the card
Config.MaxTotalCreditCards = 10         -- max total cards a player can have per account

-- only used when Config.EnableCards = true
Config.InventoryResource = "qb-inventory"
Config.MaxActiveCreditCards = 3             -- max active cards a player can have per account
Config.CreditCardItem = "bank_card"         -- item name for the card

Config.PlayerCanChangeDailyLimit = false     -- true = player can change daily limit (Only one card type will be available)
Config.MaxDailyLimit = 100000               -- max daily limit for the card
Config.DefaultCard = 2                      -- index of the default card (1 = Standard Card, 2 = Premium Card, 3 = Gold Card) | used if PlayerCanChangeDailyLimit is true

Config.CreditCards = {
    {
        label = "Standard Card",
        dailyLimit = 2500,
        price = 100,
    },
    {
        label = "Premium Card",
        dailyLimit = 5000,
        price = 200,
    },
    {
        label = "Gold Card",
        dailyLimit = 10000,
        price = 300,
    },
}

Config.DailyLimitResetHour = 0    -- Reset hour (-23 to 23, negative = X hours before midnight)
Config.DailyLimitResetMinute = 0  -- Reset minute (0-59)

-- =========================
-- SAVINGS SETTINGS
-- =========================

Config.EnableSavings = true          -- master toggle (savings account)
Config.SavingsWeekEquivalent = 8     -- number of real days for 1 in-game week (e.g. 8 = 1 real week)
Config.SavingsEODHourUTC = 22        -- hour (0-23) for daily snapshot capture in UTC
Config.SavingsEODMinuteUTC = 00      -- minute (0-59) for daily snapshot capture in UTC
Config.SavingsPayoutStartDate = nil  -- "YYYY-MM-DD" to set payout start date, nil = auto (changing this resets all periods)

Config.SavingsInterestRate = 2.5            -- weekly interest rate in percentage (e.g. 2.5 = 2.5%)
Config.MaxActiveGoals = 4                   -- Maximum active goals per player
Config.BusinessSavingsInterestRate = 3.0    -- Business savings interest rate (can be different from personal)
Config.BusinessMaxActiveGoals = 5           -- Maximum active goals per business account
Config.CustomSavingsInterestRate = 2.5      -- weekly interest rate for custom account savings
Config.CustomMaxActiveGoals = 5             -- Maximum active goals per custom account

Config.AccountsWithSavings = {
    ["personal"] = true,
    ["business"] = true,
    ["custom"] = true,
}

-- =========================
-- LOANS SETTINGS
-- =========================

Config.EnableLoans = true               -- master toggle for loans
Config.EnableCreditScore = true         -- master toggle for credit score system

Config.AccountsWithLoans = {
    ["personal"] = true,
    ["business"] = true,
    ["custom"] = true,
}

-- 1 real day = 1 game month (86,400 seconds)
Config.TimeScale = {
    gameMonthRealSeconds = 86400, -- change to speed up / slow down months
}

Config.LoanPlans = {
    starter   = { label = "Starter Loan",   maxAmount = 5000,   interestRate = 5.5, months = 12,  enabled = true },
    standard  = { label = "Standard Loan",  maxAmount = 10000,  interestRate = 6.0, months = 24,  enabled = true },
    premium   = { label = "Premium Loan",   maxAmount = 15000,  interestRate = 6.5, months = 36,  enabled = true },
    executive = { label = "Executive Loan", maxAmount = 20000,  interestRate = 7.0, months = 48,  enabled = true },

    -- Custom: per-term custom interest (choose at creation)
    custom    = {
        label = "Custom Loan",
        maxAmount = 500000,
        options = {
            { months = 12, interestRate = 8.5 },
            { months = 24, interestRate = 9.0 },
            { months = 36, interestRate = 10.0 },
            { months = 48, interestRate = 11.0 },
            { months = 60, interestRate = 12.0 },
        },
        enabled = true
    }
}

-- Credit score (affects interestRate in percentage points)
Config.CreditScore = {
    default = 500, min = 300, max = 850,
    bands = {
        { min = 800, label = "Excellent", modifier = -3.0 },
        { min = 700, label = "Very Good", modifier = -2.0 },
        { min = 600, label = "Good",      modifier = -1.0 },
        { min = 500, label = "Fair",      modifier =  0.0 },
        { min = 400, label = "Poor",      modifier =  1.5 },
        { min = 300, label = "Very Poor", modifier =  3.0 },
    },
    deltas = { onTime = 5, late = -10, defaulted = -60 } -- score change on events
}

-- Payments (times in real hours)
Config.Payments = {
    graceHours = 6,                     -- hours after due before marked "late"
    blockNewLoansWhenLate = true,       -- prevent new loans if any late payments

    penalty = {
        pct = 10.0,                     -- % added to installment due each interval
        scoreLoss = 5,                  -- credit score lost each interval
        mode = "compounding",           -- "flat" (once after grace) or "compounding" (repeat)
        intervalHours = 12,             -- every X hours after grace
        capPct = 100.0                  -- max % fee per installment
    },

    defaultHours = 72,                  -- after this many hours late → defaulted (major score hit)
}

Config.MaxActiveLoans = 4               -- Maximum active loans per player
Config.LoanSchedulerInterval = 1800     -- Interval in seconds for loan payment checks (1800 = 30 minutes, 60 = 1 minute)
Config.LoanMaxBankMultiplier = 3.0      -- Maximum loans can be X times the total bank balance (e.g., 2.0 = 2x the bank's total money)


-- =========================
-- WORLD / SOCIETIES / BLIPS
-- =========================
Config.Societies = {
    ["police"] = {4},           -- Grades that have full access to the society bank account
    ["ambulance"] = {3, 4, 5},
}

Config.BankLocations = {
    {blip = 108, blipColor = 2, blipScale = 0.9, x = 150.266,  y = -1040.203, z = 29.374, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(149.07, -1041.02, 29.55),  size = vec3(2.85, 0.30, 1.30), rotation = 70,  maxZ = 30.9}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -1212.980,y = -330.841, z = 37.787, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-1212.98,-331.53, 38.0),   size = vec3(2.85, 0.40, 1.30), rotation = 117, maxZ = 39.25}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -2962.582,y = 482.627,  z = 15.703, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-2962.00, 482.20, 15.92), size = vec3(2.85, 0.40, 1.30), rotation = 178, maxZ = 17.1}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -112.202, y = 6469.295, z = 31.626, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-111.69, 6469.5, 31.83),  size = vec3(4.2,  0.40, 1.25), rotation = 45,  maxZ = 33.15}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = 314.187,  y = -278.621, z = 54.170, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(313.26, -279.38, 54.35),  size = vec3(2.85, 0.40, 1.30), rotation = 250, maxZ = 55.7}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -351.534, y = -49.529,  z = 49.042, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-351.81, -50.2, 49.24),  size = vec3(2.85, 0.30, 1.30), rotation = 250, maxZ = 50.5}},
    {blip = 108, blipColor = 3, blipScale = 1.2, x = 253.38,   y = 220.79,   z = 106.29, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(252.8,  221.9, 106.20), size = vec3(3.6,  0.20, 1.70), rotation = 250, maxZ = 107.6}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = 1175.064, y = 2706.643, z = 38.094, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(1175.72,2707.36, 38.30), size = vec3(2.85, 0.40, 1.30), rotation = 270, maxZ = 39.5}},
}

Config.ATMDistance = 1.5
Config.ATM = {
    {model = -870868698},
    {model = -1126237515},
    {model = -1364697528},
    {model = 506770882}
}

-- =========================
-- DISCORD LOGS
-- =========================
Config.BotName = 'ServerName'
Config.ServerName = 'ServerName'
Config.IconURL = ''
Config.DateFormat = '%d/%m/%Y [%X]'

Config.Webhook = {
    -- Banking transactions
    ["deposit"] = { enabled = true, color = '3066993' },
    ["withdraw"] = { enabled = true, color = '15158332' },
    ["transfer"] = { enabled = true, color = '3447003' },
    
    -- Savings (deposit/withdraw/transfer to/from savings)
    ["savings_deposit"] = { enabled = true, color = '3066993' },
    ["savings_withdraw"] = { enabled = true, color = '15158332' },
    ["savings_transfer"] = { enabled = true, color = '3447003' },
    
    -- Loans
    ["loan_create"] = { enabled = true, color = '16776960' },
    
    -- Custom Accounts
    ["account_create"] = { enabled = true, color = '3066993' },
    ["account_delete"] = { enabled = true, color = '15158332' },
    
    -- Account User Management
    ["account_add_user"] = { enabled = true, color = '3066993' },
    ["account_remove_user"] = { enabled = true, color = '15158332' },
    ["account_change_permissions"] = { enabled = true, color = '16776960' },
}


-- =========================
-- LOCALES (DON'T TOUCH)
-- =========================
function _L(id)
    if Locales[Config.Locale] and Locales[Config.Locale][id] then
        return Locales[Config.Locale][id]
    else
        print("Locale '"..tostring(id).."' doesn't exist")
        return nil
    end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Debug = {
    ["global"] = false,
    ["savings"] = false,
    ["loans"] = false,
    ["sql"] = false,
}

Config.Locale = 'en'                 -- en / pt / gr / fr / de

Config.Currency = 'EUR'              -- auto-format any world currency (EUR, USD, GBP, etc.)
Config.UseCashAsItem = false

-- Notifications / UI
-- Config.okokNotify: true = use okokNotify | false = use native framework notification (QBCore.Functions.Notify)
Config.okokNotify = true
-- Config.okokTextUI: true = use okokTextUI | false = use native framework text UI (QBCore DrawText)
Config.okokTextUI = true

-- Input / Target
Config.Key = 38                      -- https://docs.fivem.net/docs/game-references/controls/#controls
Config.UseTargetOnAtm = false        -- use target system instead of TextUI on ATMs
Config.UseTargetOnBank = false       -- use target system instead of TextUI on Banks
Config.TargetSystem = 'qb-target'    -- qb-target | qtarget | ox-target
Config.TargetBankDistance = 1.5      -- target distance for banks
Config.DebugTargetZones = false      -- show target zone boxes for debugging

-- okokBilling integration (works with both frameworks)
Config.okokBilling = {
    enable = true,                  -- true = okokBilling | false = no bills system
    resource = "okokBilling",       -- only change if you renamed the resource (https://okok.tebex.io/package/5246435)
}

-- Society integration
-- For QBCore: okokBanking / qb-banking / qb-management
Config.SocietyResource = "okokBanking"

-- IBAN / Account settings
Config.IBANPrefix = "OK"
Config.IBANNumbers = 6
Config.CustomIBANMaxChars = 10
Config.CustomIBANAllowLetters = true
Config.IBANChangeCost = 200
Config.PINChangeCost = 200
Config.PrintReceiptPrice = 100
Config.NewAccountCost = 500          -- Cost to create a new account

-- Transactions only influence loading time, not UI responsiveness
-- New approach tested with 50k transactions, ~5 seconds to load bank, UI is instant
Config.MaxTransactionsPerPlayer = nil   -- nil = unlimited | 100 = 100 transactions 

Config.ShowBankBlips = true             -- show bank blips on the map

Config.ReceiptItem = "printerdocument"  -- item name for the receipt

-- =========================
-- TRANSFER CONTACTS SETTINGS
-- =========================

Config.MaxTransferContactsFavorites = 3

-- =========================
-- CUSTOM ACCOUNTS SETTINGS
-- =========================
Config.CustomAccounts = {
    Enabled = true,
    MaxAccountsPerPlayer = 3,   -- Maximum custom accounts a player can own
    CreationFee = 500,          -- Cost to create a custom account
}

-- =========================
-- CARDS SETTINGS
-- =========================
-- EnableCards = true:  Multiple cards per account with physical inventory items
-- EnableCards = false: Max 1 ACTIVE card per account stored in database (no inventory items)
--                      Uses MaxTotalCreditCards for total cards (including blocked), allows new card if no active card exists

Config.EnableCards = true
Config.CreditCardPrice = 300            -- cost to create a card
Config.CreditCardActivationFee = 200    -- fee to activate the card
Config.CreditCardRenewalFee = 100       -- fee to renew the card
Config.RenewCardTime = 8                -- time in days to renew the card
Config.MaxTotalCreditCards = 10         -- max total cards a player can have per account

-- Inventory resource (only used when Config.EnableCards = true)
-- For QBCore: qb-inventory | ox_inventory
Config.InventoryResource = "qb-inventory"
Config.MaxActiveCreditCards = 3             -- max active cards a player can have per account
Config.CreditCardItem = "bank_card"         -- item name for the card

Config.PlayerCanChangeDailyLimit = false     -- true = player can change daily limit (Only one card type will be available)
Config.MaxDailyLimit = 100000               -- max daily limit for the card
Config.DefaultCard = 2                      -- index of the default card (1 = Standard Card, 2 = Premium Card, 3 = Gold Card) | used if PlayerCanChangeDailyLimit is true

Config.CreditCards = {
    {
        label = "Standard Card",
        dailyLimit = 2500,
        price = 100,
    },
    {
        label = "Premium Card",
        dailyLimit = 5000,
        price = 200,
    },
    {
        label = "Gold Card",
        dailyLimit = 10000,
        price = 300,
    },
}

Config.DailyLimitResetHour = 0    -- Reset hour (-23 to 23, negative = X hours before midnight)
Config.DailyLimitResetMinute = 0  -- Reset minute (0-59)

-- =========================
-- SAVINGS SETTINGS
-- =========================

Config.EnableSavings = true          -- master toggle (savings account)
Config.SavingsWeekEquivalent = 8     -- number of real days for 1 in-game week (e.g. 8 = 1 real week)
Config.SavingsEODHourUTC = 22        -- hour (0-23) for daily snapshot capture in UTC
Config.SavingsEODMinuteUTC = 00      -- minute (0-59) for daily snapshot capture in UTC
Config.SavingsPayoutStartDate = nil  -- "YYYY-MM-DD" to set payout start date, nil = auto (changing this resets all periods)

Config.SavingsInterestRate = 2.5            -- weekly interest rate in percentage (e.g. 2.5 = 2.5%)
Config.MaxActiveGoals = 4                   -- Maximum active goals per player
Config.BusinessSavingsInterestRate = 3.0    -- Business savings interest rate (can be different from personal)
Config.BusinessMaxActiveGoals = 5           -- Maximum active goals per business account
Config.CustomSavingsInterestRate = 2.5      -- weekly interest rate for custom account savings
Config.CustomMaxActiveGoals = 5             -- Maximum active goals per custom account

Config.AccountsWithSavings = {
    ["personal"] = true,
    ["business"] = true,
    ["custom"] = true,
}

-- =========================
-- LOANS SETTINGS
-- =========================

Config.EnableLoans = true               -- master toggle for loans
Config.EnableCreditScore = true         -- master toggle for credit score system

Config.AccountsWithLoans = {
    ["personal"] = true,
    ["business"] = true,
    ["custom"] = true,
}

-- 1 real day = 1 game month (86,400 seconds)
Config.TimeScale = {
    gameMonthRealSeconds = 86400, -- change to speed up / slow down months
}

Config.LoanPlans = {
    starter   = { label = "Starter Loan",   maxAmount = 5000,   interestRate = 5.5, months = 12,  enabled = true },
    standard  = { label = "Standard Loan",  maxAmount = 10000,  interestRate = 6.0, months = 24,  enabled = true },
    premium   = { label = "Premium Loan",   maxAmount = 15000,  interestRate = 6.5, months = 36,  enabled = true },
    executive = { label = "Executive Loan", maxAmount = 20000,  interestRate = 7.0, months = 48,  enabled = true },

    -- Custom: per-term custom interest (choose at creation)
    custom    = {
        label = "Custom Loan",
        maxAmount = 500000,
        options = {
            { months = 12, interestRate = 8.5 },
            { months = 24, interestRate = 9.0 },
            { months = 36, interestRate = 10.0 },
            { months = 48, interestRate = 11.0 },
            { months = 60, interestRate = 12.0 },
        },
        enabled = true
    }
}

-- Credit score (affects interestRate in percentage points)
Config.CreditScore = {
    default = 500, min = 300, max = 850,
    bands = {
        { min = 800, label = "Excellent", modifier = -3.0 },
        { min = 700, label = "Very Good", modifier = -2.0 },
        { min = 600, label = "Good",      modifier = -1.0 },
        { min = 500, label = "Fair",      modifier =  0.0 },
        { min = 400, label = "Poor",      modifier =  1.5 },
        { min = 300, label = "Very Poor", modifier =  3.0 },
    },
    deltas = { onTime = 5, late = -10, defaulted = -60 } -- score change on events
}

-- Payments (times in real hours)
Config.Payments = {
    graceHours = 6,                     -- hours after due before marked "late"
    blockNewLoansWhenLate = true,       -- prevent new loans if any late payments

    penalty = {
        pct = 10.0,                     -- % added to installment due each interval
        scoreLoss = 5,                  -- credit score lost each interval
        mode = "compounding",           -- "flat" (once after grace) or "compounding" (repeat)
        intervalHours = 12,             -- every X hours after grace
        capPct = 100.0                  -- max % fee per installment
    },

    defaultHours = 72,                  -- after this many hours late → defaulted (major score hit)
}

Config.MaxActiveLoans = 4               -- Maximum active loans per player
Config.LoanSchedulerInterval = 1800     -- Interval in seconds for loan payment checks (1800 = 30 minutes, 60 = 1 minute)
Config.LoanMaxBankMultiplier = 3.0      -- Maximum loans can be X times the total bank balance (e.g., 2.0 = 2x the bank's total money)


-- =========================
-- WORLD / SOCIETIES / BLIPS
-- =========================
Config.Societies = {
    ["police"] = {4},           -- Grades that have full access to the society bank account
    ["ambulance"] = {3, 4, 5},
}

Config.BankLocations = {
    {blip = 108, blipColor = 2, blipScale = 0.9, x = 150.266,  y = -1040.203, z = 29.374, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(149.07, -1041.02, 29.55),  size = vec3(2.85, 0.30, 1.30), rotation = 70,  maxZ = 30.9}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -1212.980,y = -330.841, z = 37.787, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-1212.98,-331.53, 38.0),   size = vec3(2.85, 0.40, 1.30), rotation = 117, maxZ = 39.25}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -2962.582,y = 482.627,  z = 15.703, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-2962.00, 482.20, 15.92), size = vec3(2.85, 0.40, 1.30), rotation = 178, maxZ = 17.1}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -112.202, y = 6469.295, z = 31.626, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-111.69, 6469.5, 31.83),  size = vec3(4.2,  0.40, 1.25), rotation = 45,  maxZ = 33.15}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = 314.187,  y = -278.621, z = 54.170, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(313.26, -279.38, 54.35),  size = vec3(2.85, 0.40, 1.30), rotation = 250, maxZ = 55.7}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = -351.534, y = -49.529,  z = 49.042, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-351.81, -50.2, 49.24),  size = vec3(2.85, 0.30, 1.30), rotation = 250, maxZ = 50.5}},
    {blip = 108, blipColor = 3, blipScale = 1.2, x = 253.38,   y = 220.79,   z = 106.29, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(252.8,  221.9, 106.20), size = vec3(3.6,  0.20, 1.70), rotation = 250, maxZ = 107.6}},
    {blip = 108, blipColor = 2, blipScale = 0.9, x = 1175.064, y = 2706.643, z = 38.094, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(1175.72,2707.36, 38.30), size = vec3(2.85, 0.40, 1.30), rotation = 270, maxZ = 39.5}},
}

Config.ATMDistance = 1.5
Config.ATM = {
    {model = -870868698},
    {model = -1126237515},
    {model = -1364697528},
    {model = 506770882}
}

-- =========================
-- DISCORD LOGS
-- =========================
Config.BotName = 'ServerName'
Config.ServerName = 'ServerName'
Config.IconURL = ''
Config.DateFormat = '%d/%m/%Y [%X]'

Config.Webhook = {
    -- Banking transactions
    ["deposit"] = { enabled = true, color = '3066993' },
    ["withdraw"] = { enabled = true, color = '15158332' },
    ["transfer"] = { enabled = true, color = '3447003' },
    
    -- Savings (deposit/withdraw/transfer to/from savings)
    ["savings_deposit"] = { enabled = true, color = '3066993' },
    ["savings_withdraw"] = { enabled = true, color = '15158332' },
    ["savings_transfer"] = { enabled = true, color = '3447003' },
    
    -- Loans
    ["loan_create"] = { enabled = true, color = '16776960' },
    
    -- Custom Accounts
    ["account_create"] = { enabled = true, color = '3066993' },
    ["account_delete"] = { enabled = true, color = '15158332' },
    
    -- Account User Management
    ["account_add_user"] = { enabled = true, color = '3066993' },
    ["account_remove_user"] = { enabled = true, color = '15158332' },
    ["account_change_permissions"] = { enabled = true, color = '16776960' },
}


-- =========================
-- LOCALES (DON'T TOUCH)
-- =========================
function _L(id)
    if Locales[Config.Locale] and Locales[Config.Locale][id] then
        return Locales[Config.Locale][id]
    else
        print("Locale '"..tostring(id).."' doesn't exist")
        return nil
    end
end
```

{% endtab %}
{% endtabs %}


# Exports

Server-side

### **Get Account, Add Money and Remove Money**

<pre class="language-lua"><code class="lang-lua"><strong>exports['okokBanking']:GetAccount(society)
</strong>exports['okokBanking']:AddMoney(society, value)
exports['okokBanking']:RemoveMoney(society, value)
</code></pre>

### **Add Transaction to Player Transaction History**

```lua
exports['okokBanking']:AddTransaction(citizenid, transactionData, source)
```

#### Variables:

**citizen\_id**: `The player's unique identifier - can be citizenid, job name, or account identifier`

```lua
transactionData: { 
      sender_identifier = "steam:110000123456789", -- senderIdentifier/senderCitizenid
      sender_name = "John Doe", 
      receiver_identifier = "bank", -- receiverIdentifier/receiverCitizenid
      receiver_name = "Bank", 
      value = 500, 
      type = "deposit", 
      reason = "ATM Deposit"
}         
```

**source**: `source` (Optional - The player's server source ID for webhook purposes)

### **Get Player Transaction History**

```lua
exports['okokBanking']:GetPlayerTransactions(citizenid, limit)
```

#### Variables:

**citizen\_id**: `The player's unique identifier - can be citizenid, job name, or account identifier`

**limit:** `50` (Optional - Maximum number of transactions to return. If `nil`, returns all transactions. If `0` or negative, returns empty table)

**Example Usage:**

```lua
-- Get all transactions
local allTransactions = exports['okokBanking']:GetPlayerTransactions("steam:110000123456789")

-- Get last 10 transactions
local recentTransactions = exports['okokBanking']:GetPlayerTransactions("steam:110000123456789", 10)
```


# Legacy Docs (V1)

[**YouTube Video**](https://www.youtube.com/watch?v=-bC489zMaZI)

## **Installation Guide**

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokbanking_transactions`	(
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `receiver_identifier` varchar(255) NOT NULL,
    `receiver_name` varchar(255) NOT NULL,
    `sender_identifier` varchar(255) NOT NULL,
    `sender_name` varchar(255) NOT NULL,
    `date` varchar(255) NOT NULL,
    `value` int(50) NOT NULL,
    `type` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `okokbanking_societies`	(
    `society` varchar(255) NULL DEFAULT NULL,
    `society_name` varchar(255) NULL DEFAULT NULL,
    `value` int(50) NULL DEFAULT NULL,
    `iban` varchar(255) NOT NULL,
    `is_withdrawing` int(1) NULL DEFAULT NULL
);
```

If using **ESX**, execute the following code as well:

```sql
ALTER TABLE `users` ADD COLUMN `iban` varchar(255) NULL DEFAULT NULL;
ALTER TABLE `users` ADD COLUMN `pincode` int(50) NULL DEFAULT NULL;
```

If using **QBCore**, execute the following code:

```sql
ALTER TABLE `players` ADD COLUMN `pincode` int(50) NULL DEFAULT NULL;
```

**\[QBCore]** If using **management funds**:

```sql
ALTER TABLE `management_funds` ADD COLUMN `iban` varchar(255) DEFAULT NULL;
```

**\[QBCore]** If not using management funds:

```sql
ALTER TABLE `bank_accounts` ADD COLUMN `iban` varchar(255) DEFAULT NULL;
```

#### QBCORE ONLY <a href="#qbcore-only" id="qbcore-only"></a>

Navigate to **qb-core/server/player.lua** and add the following code underneath **`function self.Functions.SetJobDuty(onDuty) ... end`**:

```lua
self.Functions.ChangeIban = function(iban)
    self.PlayerData.charinfo.account = iban
    self.Functions.UpdatePlayerData()
end
```

#### **Exports** <a href="#exports" id="exports"></a>

```lua
exports['okokBanking']:GetAccount(society)
exports['okokBanking']:AddMoney(society, value)
exports['okokBanking']:RemoveMoney(society, value)
```

#### Server artifacts <a href="#server-artifacts" id="server-artifacts"></a>

Make sure your server artifacts version is above the **5181**.

* Windows: [https://runtime.fivem.net/artifacts/fivem/build\_server\_windows/master/](https://web.archive.org/web/20251110125631mp_/https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/)
* Linux: [https://runtime.fivem.net/artifacts/fivem/build\_proot\_linux/master/](https://web.archive.org/web/20251110125631mp_/https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/)


# okokVehicleShopV2

[**YouTube Video**](https://www.youtube.com/watch?v=ryIyEbA6OEQ)

## **Installation Guide**

### Requirements

ox\_lib **v3.16.2+** (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>);

Flatbed (<https://github.com/flowdgodx/flatbed>).

#### Upgrade Instructions for Previous Version Users (v1)

In case you had the previous okokVehicleShop version execute the code below in your database, otherwise ignore it.

```sql
ALTER TABLE `okokvehicleshop_shops` ADD `weekly_profit_goal` INT NOT NULL DEFAULT 250000;
ALTER TABLE `okokvehicleshop_shops` ADD `weekly_profits` INT NOT NULL DEFAULT 0;

ALTER TABLE `okokvehicleshop_vehicles` DROP COLUMN `listed`;

ALTER TABLE `okokvehicleshop_orders` ADD `customer_name` varchar(255) NOT NULL;
ALTER TABLE `okokvehicleshop_orders` ADD `customer_phone` varchar(255) NOT NULL;
ALTER TABLE `okokvehicleshop_orders` ADD `customer_id` varchar(255) NOT NULL;
ALTER TABLE `okokvehicleshop_orders` ADD `status` varchar(255) NOT NULL;
ALTER TABLE `okokvehicleshop_orders` ADD `buy_price` varchar(255) NOT NULL DEFAULT 0;
ALTER TABLE `okokvehicleshop_orders` ADD `price` varchar(255) NOT NULL DEFAULT 0;
ALTER TABLE `okokvehicleshop_orders` ADD `custom_order` TINYINT(1) NOT NULL DEFAULT 0;
ALTER TABLE `okokvehicleshop_orders` ADD `vehicle_color` LONGTEXT NOT NULL;
ALTER TABLE `okokvehicleshop_orders` ADD `personal_purchase` TINYINT(1) NOT NULL DEFAULT 0;

ALTER TABLE `okokvehicleshop_orders` DROP COLUMN `in_progress`;

CREATE TABLE IF NOT EXISTS `okokvehicleshop_financed_vehicles`(
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `vehicle_name` varchar(255) NOT NULL,
    `vehicle_id` varchar(255) NOT NULL,
    `vehicle_plate` varchar(255) NOT NULL,
    `finance_amount` BIGINT DEFAULT 0,
    `monthly_payment` BIGINT DEFAULT 0,
    `paid_amount` BIGINT DEFAULT 0,
    `owner_id` varchar(255) NOT NULL,
    `failed_payments` int(11) NOT NULL DEFAULT 0,
    `success_payments` int(11) NOT NULL DEFAULT 0,
    `total_payments` int(11) NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`)
);
```

#### Execute the following SQL code in your database:

```sql
CREATE TABLE IF NOT EXISTS `okokvehicleshop_shops`(
    `shop_name` varchar(255) NOT NULL,
    `shop_id` varchar(255) NOT NULL PRIMARY KEY,
    `owner` varchar(255) NULL DEFAULT NULL,
    `owner_name` varchar(255) NULL DEFAULT NULL,
    `money` varchar(255) NOT NULL,
    `employees` longtext NULL,
    `weekly_profit_goal` INT NOT NULL DEFAULT 250000,
    `weekly_profits` INT NOT NULL DEFAULT 0
);

CREATE TABLE IF NOT EXISTS `okokvehicleshop_vehicles`(
    `vehicle_name` varchar(255) NOT NULL,
    `vehicle_id` varchar(255) NOT NULL,
    `category` varchar(255) NOT NULL,
    `type` varchar(255) NOT NULL,
    `stock` LONGTEXT NULL,
    `min_price` BIGINT NOT NULL,
    `max_price` BIGINT NOT NULL,
    `owner_buy_price` BIGINT NOT NULL
);

CREATE TABLE IF NOT EXISTS `okokvehicleshop_saleshistory`(
    `shop_id` varchar(255) NOT NULL,
    `vehicle_name` varchar(255) NOT NULL,
    `vehicle_id` varchar(255) NOT NULL,
    `buyer_name` varchar(255) NOT NULL,
    `buyer_id` varchar(255) NOT NULL,
    `price` varchar(255) NOT NULL,
    `date` varchar(255) NOT NULL
);

CREATE TABLE IF NOT EXISTS `okokvehicleshop_orders`(
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `shop_id` varchar(255) NOT NULL,
    `shop_type` varchar(255) NOT NULL,
    `vehicle_name` varchar(255) NOT NULL,
    `vehicle_id` varchar(255) NOT NULL,
    `reward` varchar(255) NOT NULL,
    `buy_price` varchar(255) NOT NULL DEFAULT 0,
    `price` varchar(255) NOT NULL DEFAULT 0,
    `status` varchar(255) NOT NULL,
    `employee_name` varchar(255) NOT NULL,
    `employee_id` varchar(255) NOT NULL,
    `customer_name` varchar(255) NOT NULL,
    `customer_id` varchar(255) NOT NULL,
    `customer_phone` varchar(255) NOT NULL,
    `custom_order` TINYINT(1) NOT NULL DEFAULT 0,
    `vehicle_color` LONGTEXT NOT NULL,
    `personal_purchase` TINYINT(1) NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `okokvehicleshop_logs`(
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `shop_id` varchar(255) NOT NULL,
    `action` varchar(255) NOT NULL,
    `employee_name` varchar(255) NOT NULL,
    `employee_id` varchar(255) NOT NULL,
    `date` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `okokvehicleshop_financed_vehicles`(
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `vehicle_name` varchar(255) NOT NULL,
    `vehicle_id` varchar(255) NOT NULL,
    `vehicle_plate` varchar(255) NOT NULL,
    `finance_amount` BIGINT DEFAULT 0,
    `paid_amount` BIGINT DEFAULT 0,
    `monthly_payment` BIGINT DEFAULT 0,
    `owner_id` varchar(255) NOT NULL,
    `failed_payments` int(11) NOT NULL DEFAULT 0,
    `success_payments` int(11) NOT NULL DEFAULT 0,
    `total_payments` int(11) NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`)
);
```

### Ace Permissions

Go to your **server.cfg** and add the following:

{% tabs %}
{% tab title="QBCore" %}

```lua
add_ace qbcore.god okokvehicleshop allow
```

{% endtab %}

{% tab title="ESX" %}

```lua
add_ace group.admin okokvehicleshop allow
```

{% endtab %}
{% endtabs %}

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

-- =========================
-- CORE/TOGGLES
-- =========================
Config.Debug = false -- true = will print some debug messages
Config.Locale = 'en' -- en
Config.AddVehiclesFromVehiclesFile = false -- true = will add vehicles from qbcore/shared/vehicles.lua

-- Notifications/UI/Integrations
Config.UseOkokNotify = GetResourceState('okokNotify') == 'started' and true or false -- if you want to use okokNotify set it to true
Config.UseOkokTextUI = GetResourceState('okokTextUI') == 'started' and true or false -- if you want to use okokTextUI set it to true
Config.UseOkokRequests = GetResourceState('okokRequests') == 'started' and true or false -- if you want to use okokRequests set it to true
Config.SocietyGarage = "okokGarage" -- Used for society purchases and trade-in vehicles
Config.KeySystem = 'qb-vehiclekeys' -- qb-vehiclekeys (change on cl_utils.lua)

-- Vehicle Listing Settings
Config.VehicleListingType = 'normal' -- 'normal' all vehicles in the same page | 'categories' all vehicles in categories
Config.DatabaseUpdateInterval = 300 -- How often the database will be updated in seconds
Config.UseSameImageForAllVehicles = false -- true = will use the same image for all vehicles (web/img/vehicles/default.png) | false = will use the image from the vehicle_id
Config.UseLocalImages = false -- true = will use images from /web/img/vehicles | false = it will get the images from the github repository, if not found it will use an image from the web/img/vehicles/

-- Input/Target
Config.UseTarget = false -- true = will use target | false = will use marker
Config.TargetSystem = 'qb-target' -- 'ox-target' | 'qb-target'
Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

-- Currency/Business
Config.Currency = '€' -- Currency symbol
Config.CurrencySide = 'right' -- left | right
Config.MaxEmployeesPerDealership = 5 -- Maximum number of employees per dealership
Config.HireRange = 3 -- Range to hire an employee
Config.WeeklyGoalResetHours = 168 -- How many hours to reset the weekly goal (168 = 1 week)

-- Pricing Settings
Config.UseMultiplierFactorForMinPrice = false -- true = calculate min price based on the multiplier factor (price*Config.MinPriceMultiplier) | false = min price will be the base price
Config.MinPriceMultiplier = 0.5 -- This is the multiplier factor for the min price (Config.UseMultiplierFactorForMinPrice = true)
Config.UseMultiplierFactorForMaxPrice = false -- true = calculate price based on the multiplier factor (price*Config.MaxPriceAddition) | false = calculate price based on the max price addition (price+Config.MaxPriceAddition)
Config.MaxPriceAddition = 5000 -- This is how much will be added to the vehicle price to create the max_price
Config.OwnerBuyVehiclePercentage = 10 -- How much of a discount the owner has to order a vehicle (bases on the min. price)
Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

-- Plate Settings
Config.PlateLetters = 4 -- How many letters the plate has
Config.PlateNumbers = 4 -- How many numbers the plate has
Config.PlateUseSpace = false -- If the plate uses spaces between letters and numbers
Config.EnableCustomPlates = true -- If true = players can use custom plates for their vehicles
Config.CustomPlatePrice = 1000 -- The price for a custom plate

-- Interface/History Settings
Config.SalesDateFormat = "%d/%m - %H:%M" -- Format of the sales date
Config.MaxLogsDays = 7 -- How many days to keep the logs on the UI (the old ones it will be saved on the database)
Config.MaxEntriesOnVehicleHistory = 24 -- How many entries to keep on the vehicle history to avoid any performance issues

-- Vehicle Classes
Config.UseVehicleClasses = true -- If you want to use vehicle classes set it to true
Config.CalculateVehicleClasses = false -- If you want to enable vehicle class calculation set it to true
Config.VehicleClasses = {
    ['C'] = 350,
    ['B'] = 400,
    ['A'] = 600,
    ['S'] = 800,
    ['S+'] = 1000,
}

-- =========================
-- MISSIONS/ORDERS
-- =========================
Config.MissionForStock = true -- false = when you order a vehicle, the vehicle shop will instantly receive it without doing any order/mission
Config.OrderReceivePercentage = true -- If true = players will receive a percentage of the vehicle price (Config.OrderCompletedPercentage) | if false = players receive a flat rate (Config.OrderCompletedFlatRate)
Config.OrderCompletedPercentage = 10 -- When a employee completes the misson he will get this percentage as a reward, 10 = 10% (Config.OrderReceivePercentage = true)
Config.OrderCompletedFlatRate = 1000 -- When a employee completes the misson he will get paid this value (Config.OrderReceivePercentage = false)
Config.CancelCustomOrderFee = 5 -- When a player cancels a custom order he will lose a fee of the vehicle price, 5 = 5%

-- Vehicle Sales/Trade-ins
Config.EnableSellVehicle = true -- If true = players can sell their vehicles to the vehicle shop
Config.SellVehiclePercentage = 50 -- When a player sells a vehicle to the vehicle shop he will get a percentage of the vehicle price, 50 = 50%
Config.EnableTradeIns = true -- If true = players can trade-in their vehicles for a discount on a new vehicle
Config.TradeInPercentage = 75 -- This is the percentage of the vehicle price that will be given as a discount for the trade-in
Config.TradeInStored = true -- If true = player can only trade-in vehicles that are stored
Config.SocietyTradeInRanksLevel = {3, 4}

-- Blips & Markers
Config.TruckBlip = {blipId = 67, blipColor = 2, blipScale = 0.9, blipText = "Truck"} -- Blip of the truck when someone accepts an order
Config.TrailerBlip = {blipId = 515, blipColor = 2, blipScale = 0.9, blipText = "Trailer"} -- Blip of the trailer when someone accepts an order (for vehicle shops with big vehicles)
Config.OrderBlip = {blipId = 478, blipColor = 5, blipText = "Order"}  -- Blip of the ordered vehicle when someone accepts an order
Config.TowMarker = {id = 21, size = {x = 0.5, y = 0.5, z = 0.5}, color = {r = 31, g = 94, b = 255, a = 90}, bobUpAndDown = false, faceCamera = false, rotate = true, drawOnEnts = false, textureDict = false, textureName = false} -- The marker to tow a vehicle when someone accepts an order

-- Commands & Resources
Config.AdminMenuCommand = "vsadmin" -- Command to open the admin menu
Config.FlatbedResourceName = "flatbed" -- Name of the flatbed resource (Get it here: https://github.com/flowdgodx/flatbed)
Config.SmallTowTruckID = "flatbed3" -- Id of the truck used to tow the vehicle 
Config.BigTowTruckID = "Hauler"
Config.TrailerID = "TRFlat"

-- =========================
-- JOB RANKS/GOALS
-- =========================
Config.JobRanks = { -- These are the ranks available on the vehicle shops, you can add or remove as many as you want but leave at least 1
	{rank = "Newbie", subowner = false},
	{rank = "Experienced", subowner = false},
	{rank = "Expert", subowner = false},
	{rank = "Sub-Owner", subowner = true}
}

Config.WeeklyGoalOptions = { -- Weekly goal options to show on the dashboard
    [1] = 10000,
	[2] = 25000,
	[3] = 50000,
	[4] = 100000,
	[5] = 250000,
	[6] = 500000,
}

-- =========================
-- FINANCE SETTINGS
-- =========================
Config.FinanceVehiclesSettings = {
	["command"] = "financedvehicles", -- command to open the finance menu
	["interest_rate"] = 0.15, -- 15% interest rate
	["payment_check_interval"] = 12, -- real hours
	["payments"] = 12, -- how many payments will be made
	["max_failed_payments"] = 3, -- maximum number of failed payments before the vehicle is repossessed
	["max_financed_vehicles"] = 2, -- maximum number of financed vehicles per player
}

-- =========================
-- VEHICLE CATEGORIES
-- =========================
Config.Categories = { -- Get the type from the database and make sure to add it here according to the type of vehicle for the test drive to be able to identify the vehicle type
	["car"] = { -- car categories
		vehicles = true,
		luxury = true,
	},
	["boat"] = { -- boat categories
		boats = true,
	},
	["air"] = { -- air categories
		air = true,
	},
}

Config.CategoriesLabels = { -- Categories labels to show on the UI
	["air"] = "Air",
	["bicycles"] = "Bicycles",
	["boat"] = "Boat",
	["car"] = "Car",
	["compacts"] = "Compacts",
	["commercial"] = "Commercial",
	["coupes"] = "Coupes",
	["emergency"] = "Emergency",
	["exotic"] = "Exotic",
	["industrial"] = "Industrial",
	["military"] = "Military",
	["motorcycles"] = "Motorcycles",
	["muscle"] = "Muscle",
	["offroad"] = "Offroad",
	["openwheel"] = "Open Wheel",
	["sedans"] = "Sedans",
	["service"] = "Service",
	["sports"] = "Sports",
	["sportsclassics"] = "Sports Classics",
	["super"] = "Super",
	["suvs"] = "SUVs",
	["utility"] = "Utility",
	["vans"] = "Vans",
	["trains"] = "Trains",
	["cycles"] = "Cycles",
	["helicopters"] = "Helicopters",
	["planes"] = "Planes"
}

-- =========================
-- VEHICLE SHOPS/LOCATIONS
-- =========================

Config.Stands = {
	{
		label = "PDM Vehicle Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = true, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(-31.74, -1113.78, 26.42), -- blip position for the vehicle shop
		isVip = false, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector3(-76.54, -821.94, 284.58),
			camera = vector4(-71.75, -827.75, 285.75, 40.86),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(-45.5, -1083.26, 26.73), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(-56.32, -1117.04, 26.01, 3.77)},
				{vector4(-53.47, -1116.9, 26.02, 1.33)},
				{vector4(-50.68, -1116.54, 26.01, 3.26)},
				{vector4(-47.76, -1116.39, 26.01, 3.02)},
				{vector4(-63.0, -1104.08, 25.84, 68.92)},
				{vector4(-65.27, -1110.46, 25.81, 68.81)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
            ownerCoords = vector3(-31.8, -1114.15, 26.42), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-55.81, -1096.49, 26.42), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
            ownerCoords = vector3(-33.06, -1115.08, 27.26), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-55.81, -1096.49, 26.42), -- Marker/Shop position for vehicle listing
        },

        flatbedSettings = {
            spawnPosition = vector4(-17.79, -1105.18, 26.76, 160.4),
            towCoords = {bone = 'bodyshell', xPos = 0.0, yPos = -2.35, zPos = 1.0},
            bigVehicles = false, -- Set to true if it's airplanes/helicopters/etc... it'll use a truck instead of a flatbed to get the ordered vehicles
        },

		missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(-548.71, -1075.94, 22.37),
			vector3(510.52, -1131.9, 29.32),
			vector3(-166.16, -1433.21, 31.2),
		},

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 225, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "vehicles", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "vehicles1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{
		label = "Air Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = true, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(-1651.31, -3140.09, 13.99), -- blip position for the vehicle shop
		isVip = false, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector(-1653.95, -3145.65, 13.57),
			camera = vector4(-1646.35, -3136.25, 13.99, 137.72),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(-1613.93, -3120.78, 13.29), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(-1635.53, -3101.68, 13.94, 339.18)},
				{vector4(-1613.15, -3113.99, 13.94, 329.95)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
            ownerCoords = vector3(-1621.36, -3152.85, 13.99), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-1651.31, -3140.09, 13.99), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
            ownerCoords = vector3(-1621.36, -3152.85, 13.99), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-1651.31, -3140.09, 13.99), -- Marker/Shop position for vehicle listing
        },

        flatbedSettings = {
            spawnPosition = vector4(-1623.12, -3125.0, 13.94, 328.06),
            towCoords = {bone = 'bodyshell', xPos = 0.0, yPos = -2.35, zPos = 1.0},
            bigVehicles = true, -- Set to true if it's airplanes/helicopters/etc... it'll use a truck instead of a flatbed to get the ordered vehicles
        },

		missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(-1576.84, -3096.82, 13.94),
		},

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 64, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "air", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "air1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{
		label = "VIP Vehicle Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = false, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(-803.42, -224.29, 37.22), -- blip position for the vehicle shop
		isVip = true, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector3(-76.54, -821.94, 284.58),
			camera = vector4(-71.75, -827.75, 285.75, 40.86),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(-768.73, -244.28, 37.24), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(-804.76, -235.02, 36.45, 28.62)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
			vehicleCoords = vector3(-803.42, -224.29, 37.22), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
			vehicleCoords = vector3(-803.42, -224.29, 37.22), -- Marker/Shop position for vehicle listing
        },

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 225, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "vehicles", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "vehicles2", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{
		label = "PDM Vehicle Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = true, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(660.3, 593.22, 129.24), -- blip position for the vehicle shop
		isVip = false, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector3(-76.54, -821.94, 284.58),
			camera = vector4(-71.75, -827.75, 285.75, 40.86),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(651.12, 597.1, 128.49), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(651.12, 597.1, 128.49, 70.46)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
            ownerCoords = vector3(660.2, 592.93, 129.24), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(656.16, 588.69, 129.05), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
            ownerCoords = vector3(660.2, 592.93, 129.24), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(656.16, 588.69, 129.05), -- Marker/Shop position for vehicle listing
        },

        flatbedSettings = {
            spawnPosition = vector4(644.99, 595.83, 129.0, 339.32),
            towCoords = {bone = 'bodyshell', xPos = 0.0, yPos = -2.35, zPos = 0.90},
            bigVehicles = false, -- Set to true if it's airplanes/helicopters/etc... it'll use a truck instead of a flatbed to get the ordered vehicles
        },

		missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
		vector3(682.89, 670.85, 128.49),
		},

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 225, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "vehicles", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "vehicles3", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
}
```

{% endtab %}

{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

-- =========================
-- CORE/TOGGLES
-- =========================
Config.Debug = false -- true = will print some debug messages
Config.Locale = 'en' -- en
Config.AddVehiclesFromVehiclesFile = false -- true = will add vehicles from the vehicles table in the database

-- Notifications/UI/Integrations
Config.UseOkokNotify = GetResourceState('okokNotify') == 'started' and true or false -- if you want to use okokNotify set it to true
Config.UseOkokTextUI = GetResourceState('okokTextUI') == 'started' and true or false -- if you want to use okokTextUI set it to true
Config.UseOkokRequests = GetResourceState('okokRequests') == 'started' and true or false -- if you want to use okokRequests set it to true
Config.SocietyGarage = "okokGarage" -- Used for society purchases and trade-in vehicles
Config.KeySystem = '' -- (change on cl_utils.lua)

-- Vehicle Listing Settings
Config.VehicleListingType = 'normal' -- 'normal' all vehicles in the same page | 'categories' all vehicles in categories
Config.DatabaseUpdateInterval = 300 -- How often the database will be updated in seconds
Config.UseSameImageForAllVehicles = false -- true = will use the same image for all vehicles (web/img/vehicles/default.png) | false = will use the image from the vehicle_id
Config.UseLocalImages = false -- true = will use images from /web/img/vehicles | false = it will get the images from the github repository, if not found it will use an image from the web/img/vehicles/

-- Input/Target
Config.UseTarget = false -- true = will use target | false = will use marker
Config.TargetSystem = 'ox-target' -- 'ox-target'
Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

-- Currency/Business
Config.Currency = '€' -- Currency symbol
Config.CurrencySide = 'right' -- left | right
Config.MaxEmployeesPerDealership = 5 -- Maximum number of employees per dealership
Config.HireRange = 3 -- Range to hire an employee
Config.WeeklyGoalResetHours = 168 -- How many hours to reset the weekly goal (168 = 1 week)

-- Pricing Settings
Config.UseMultiplierFactorForMinPrice = false -- true = calculate min price based on the multiplier factor (price*Config.MinPriceMultiplier) | false = min price will be the base price
Config.MinPriceMultiplier = 0.5 -- This is the multiplier factor for the min price (Config.UseMultiplierFactorForMinPrice = true)
Config.UseMultiplierFactorForMaxPrice = false -- true = calculate price based on the multiplier factor (price*Config.MaxPriceAddition) | false = calculate price based on the max price addition (price+Config.MaxPriceAddition)
Config.MaxPriceAddition = 5000 -- This is how much will be added to the vehicle price to create the max_price
Config.OwnerBuyVehiclePercentage = 10 -- How much of a discount the owner has to order a vehicle (bases on the min. price)
Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

-- Plate Settings
Config.PlateLetters = 4 -- How many letters the plate has
Config.PlateNumbers = 4 -- How many numbers the plate has
Config.PlateUseSpace = false -- If the plate uses spaces between letters and numbers
Config.EnableCustomPlates = true -- If true = players can use custom plates for their vehicles
Config.CustomPlatePrice = 1000 -- The price for a custom plate

-- Interface/History Settings
Config.SalesDateFormat = "%d/%m - %H:%M" -- Format of the sales date
Config.MaxLogsDays = 7 -- How many days to keep the logs on the UI (the old ones it will be saved on the database)
Config.MaxEntriesOnVehicleHistory = 24 -- How many entries to keep on the vehicle history to avoid any performance issues

-- Vehicle Classes
Config.UseVehicleClasses = true -- If you want to use vehicle classes set it to true
Config.CalculateVehicleClasses = false -- If you want to enable vehicle class calculation set it to true
Config.VehicleClasses = {
    ['C'] = 350,
    ['B'] = 400,
    ['A'] = 600,
    ['S'] = 800,
    ['S+'] = 1000,
}

-- =========================
-- MISSIONS/ORDERS
-- =========================
Config.MissionForStock = true -- false = when you order a vehicle, the vehicle shop will instantly receive it without doing any order/mission
Config.OrderReceivePercentage = true -- If true = players will receive a percentage of the vehicle price (Config.OrderCompletedPercentage) | if false = players receive a flat rate (Config.OrderCompletedFlatRate)
Config.OrderCompletedPercentage = 10 -- When a employee completes the misson he will get this percentage as a reward, 10 = 10% (Config.OrderReceivePercentage = true)
Config.OrderCompletedFlatRate = 1000 -- When a employee completes the misson he will get paid this value (Config.OrderReceivePercentage = false)
Config.CancelCustomOrderFee = 5 -- When a player cancels a custom order he will lose a fee of the vehicle price, 5 = 5%

-- Vehicle Sales/Trade-ins
Config.EnableSellVehicle = true -- If true = players can sell their vehicles to the vehicle shop
Config.SellVehiclePercentage = 50 -- When a player sells a vehicle to the vehicle shop he will get a percentage of the vehicle price, 50 = 50%
Config.EnableTradeIns = true -- If true = players can trade-in their vehicles for a discount on a new vehicle
Config.TradeInPercentage = 75 -- This is the percentage of the vehicle price that will be given as a discount for the trade-in
Config.TradeInStored = true -- If true = player can only trade-in vehicles that are stored
Config.SocietyTradeInRanksLevel = {3, 4}

-- Blips & Markers
Config.TruckBlip = {blipId = 67, blipColor = 2, blipScale = 0.9, blipText = "Truck"} -- Blip of the truck when someone accepts an order
Config.TrailerBlip = {blipId = 515, blipColor = 2, blipScale = 0.9, blipText = "Trailer"} -- Blip of the trailer when someone accepts an order (for vehicle shops with big vehicles)
Config.OrderBlip = {blipId = 478, blipColor = 5, blipText = "Order"}  -- Blip of the ordered vehicle when someone accepts an order
Config.TowMarker = {id = 21, size = {x = 0.5, y = 0.5, z = 0.5}, color = {r = 31, g = 94, b = 255, a = 90}, bobUpAndDown = false, faceCamera = false, rotate = true, drawOnEnts = false, textureDict = false, textureName = false} -- The marker to tow a vehicle when someone accepts an order

-- Commands & Resources
Config.AdminMenuCommand = "vsadmin" -- Command to open the admin menu
Config.FlatbedResourceName = "flatbed" -- Name of the flatbed resource (Get it here: https://github.com/flowdgodx/flatbed)
Config.SmallTowTruckID = "flatbed3" -- Id of the truck used to tow the vehicle 
Config.BigTowTruckID = "Hauler"
Config.TrailerID = "TRFlat"

-- =========================
-- JOB RANKS/GOALS
-- =========================
Config.JobRanks = { -- These are the ranks available on the vehicle shops, you can add or remove as many as you want but leave at least 1
	{rank = "Newbie", subowner = false},
	{rank = "Experienced", subowner = false},
	{rank = "Expert", subowner = false},
	{rank = "Sub-Owner", subowner = true}
}

Config.WeeklyGoalOptions = { -- Weekly goal options to show on the dashboard
    [1] = 10000,
	[2] = 25000,
	[3] = 50000,
	[4] = 100000,
	[5] = 250000,
	[6] = 500000,
}

-- =========================
-- FINANCE SETTINGS
-- =========================
Config.FinanceVehiclesSettings = {
	["command"] = "financedvehicles", -- command to open the finance menu
	["interest_rate"] = 0.15, -- 15% interest rate
	["payment_check_interval"] = 12, -- real hours
	["payments"] = 12, -- how many payments will be made
	["max_failed_payments"] = 3, -- maximum number of failed payments before the vehicle is repossessed
	["max_financed_vehicles"] = 2, -- maximum number of financed vehicles per player
}

-- =========================
-- VEHICLE CATEGORIES
-- =========================
Config.Categories = { -- Get the type from the database and make sure to add it here according to the type of vehicle for the test drive to be able to identify the vehicle type
	["car"] = { -- car categories
		vehicles = true,
		luxury = true,
	},
	["boat"] = { -- boat categories
		boats = true,
	},
	["air"] = { -- air categories
		air = true,
	},
}

Config.CategoriesLabels = { -- Categories labels to show on the UI
	["air"] = "Air",
	["bicycles"] = "Bicycles",
	["boat"] = "Boat",
	["car"] = "Car",
	["compacts"] = "Compacts",
	["commercial"] = "Commercial",
	["coupes"] = "Coupes",
	["emergency"] = "Emergency",
	["exotic"] = "Exotic",
	["industrial"] = "Industrial",
	["military"] = "Military",
	["motorcycles"] = "Motorcycles",
	["muscle"] = "Muscle",
	["offroad"] = "Offroad",
	["openwheel"] = "Open Wheel",
	["sedans"] = "Sedans",
	["service"] = "Service",
	["sports"] = "Sports",
	["sportsclassics"] = "Sports Classics",
	["super"] = "Super",
	["suvs"] = "SUVs",
	["utility"] = "Utility",
	["vans"] = "Vans",
	["trains"] = "Trains",
	["cycles"] = "Cycles",
	["helicopters"] = "Helicopters",
	["planes"] = "Planes"
}

-- =========================
-- VEHICLE SHOPS/LOCATIONS
-- =========================

Config.Stands = {
	{
		label = "PDM Vehicle Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = true, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(-31.74, -1113.78, 26.42), -- blip position for the vehicle shop
		isVip = false, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector3(-76.54, -821.94, 284.58),
			camera = vector4(-71.75, -827.75, 285.75, 40.86),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(-45.5, -1083.26, 26.73), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(-56.32, -1117.04, 26.01, 3.77)},
				{vector4(-53.47, -1116.9, 26.02, 1.33)},
				{vector4(-50.68, -1116.54, 26.01, 3.26)},
				{vector4(-47.76, -1116.39, 26.01, 3.02)},
				{vector4(-63.0, -1104.08, 25.84, 68.92)},
				{vector4(-65.27, -1110.46, 25.81, 68.81)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
            ownerCoords = vector3(-31.8, -1114.15, 26.42), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-55.81, -1096.49, 26.42), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
            ownerCoords = vector3(-33.06, -1115.08, 27.26), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-55.81, -1096.49, 26.42), -- Marker/Shop position for vehicle listing
        },

        flatbedSettings = {
            spawnPosition = vector4(-17.79, -1105.18, 26.76, 160.4),
            towCoords = {bone = 'bodyshell', xPos = 0.0, yPos = -2.35, zPos = 1.0},
            bigVehicles = false, -- Set to true if it's airplanes/helicopters/etc... it'll use a truck instead of a flatbed to get the ordered vehicles
        },

		missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(-548.71, -1075.94, 22.37),
			vector3(510.52, -1131.9, 29.32),
			vector3(-166.16, -1433.21, 31.2),
		},

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 225, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "vehicles", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "vehicles1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{
		label = "Air Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = true, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(-1651.31, -3140.09, 13.99), -- blip position for the vehicle shop
		isVip = false, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector(-1653.95, -3145.65, 13.57),
			camera = vector4(-1646.35, -3136.25, 13.99, 137.72),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(-1613.93, -3120.78, 13.29), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(-1635.53, -3101.68, 13.94, 339.18)},
				{vector4(-1613.15, -3113.99, 13.94, 329.95)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
            ownerCoords = vector3(-1621.36, -3152.85, 13.99), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-1651.31, -3140.09, 13.99), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
            ownerCoords = vector3(-1621.36, -3152.85, 13.99), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(-1651.31, -3140.09, 13.99), -- Marker/Shop position for vehicle listing
        },

        flatbedSettings = {
            spawnPosition = vector4(-1623.12, -3125.0, 13.94, 328.06),
            towCoords = {bone = 'bodyshell', xPos = 0.0, yPos = -2.35, zPos = 1.0},
            bigVehicles = true, -- Set to true if it's airplanes/helicopters/etc... it'll use a truck instead of a flatbed to get the ordered vehicles
        },

		missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(-1576.84, -3096.82, 13.94),
		},

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 64, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "air", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "air1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{
		label = "VIP Vehicle Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = false, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(-803.42, -224.29, 37.22), -- blip position for the vehicle shop
		isVip = true, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector3(-76.54, -821.94, 284.58),
			camera = vector4(-71.75, -827.75, 285.75, 40.86),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(-768.73, -244.28, 37.24), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(-804.76, -235.02, 36.45, 28.62)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
			vehicleCoords = vector3(-803.42, -224.29, 37.22), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
			vehicleCoords = vector3(-803.42, -224.29, 37.22), -- Marker/Shop position for vehicle listing
        },

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 225, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "vehicles", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "vehicles2", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{
		label = "PDM Vehicle Shop", -- name of the vehicle shop
		licenseType = "", -- if you want to use a license system you'll need to set it up on sv_utils.lua
		currency = "bank", -- used to buy/sell the business and buy vehicle
		hasOwner = true, -- true = this vehicle shop can have a owner and will need maintenance to have stock | false = no owner and with vehicles all the time, price = max_price set on the database
		blipCoords = vector3(660.3, 593.22, 129.24), -- blip position for the vehicle shop
		isVip = false, -- if set to true IT WON'T BE OWNED BY ANYONE and will use vip coins instead of currency, check sv_utils.lua to change the vip coins functions

		vehicleCameraSettings = {
			location = vector3(-76.54, -821.94, 284.58),
			camera = vector4(-71.75, -827.75, 285.75, 40.86),
		},

		vehicleSettings = {
			sellVehicleCoords = vector3(651.12, 597.1, 128.49), -- position where the vehicles can be sold
			purchaseVehicleCoords = { -- positions where the vehicles will be spawned when the player purchases a vehicle
				{vector4(651.12, 597.1, 128.49, 70.46)},
			}
		},

		testDriveSettings = {
			paid = true, -- true = the player will pay for the test drive | false = the player will not pay for the test drive
			price = 100, -- Price of the test drive
			time = 45, -- Time of the test drive in seconds
			plate = "TEST", -- Plate of the test drive vehicle [max 8 characters]
			carLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the car test drive
			boatLocation = vector4(-796.85, -1502.27, -0.09, 113.55), -- Location of the boat test drive
			airLocation = vector4(-1332.52, -2205.1, 13.34, 151.03), -- Location of the air test drive
		},

        markerSettings = {
            ownerCoords = vector3(660.2, 592.93, 129.24), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(656.16, 588.69, 129.05), -- Marker/Shop position for vehicle listing
        },

        targetSettings = {
            ownerCoords = vector3(660.2, 592.93, 129.24), -- Marker/Shop position for owner/employees
			vehicleCoords = vector3(656.16, 588.69, 129.05), -- Marker/Shop position for vehicle listing
        },

        flatbedSettings = {
            spawnPosition = vector4(644.99, 595.83, 129.0, 339.32),
            towCoords = {bone = 'bodyshell', xPos = 0.0, yPos = -2.35, zPos = 0.90},
            bigVehicles = false, -- Set to true if it's airplanes/helicopters/etc... it'll use a truck instead of a flatbed to get the ordered vehicles
        },

		missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
		vector3(682.89, 670.85, 128.49),
		},

		radius = 1, -- Interaction radius for the markers
		price = 10000, -- Price of the vehicle shop
		blip = {blipId = 225, blipColor = 3, blipColorPurchasable = 1, blipScale = 0.9}, -- Blip informations for vehicleshop blip
		marker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0}, -- Marker informations for the vehicle shop
		type = "vehicles", -- Type of shop (will change displayed vehicles) | CAN be repeated on other shops
		id = "vehicles3", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
}
```

{% endtab %}
{% endtabs %}


# Exports

Client and server-side

### Check if vehicle is financed

```lua
exports['okokVehicleShop']:isVehicleFinanced(plate)
```


# okokScoreboard

## Installation Guide

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```lua
Config, Locales = {}, {}

Config.Locale = 'en'  -- en / pt / es / fr / de

Config.Framework = GetResourceState('qb-core') == 'started' and 'qb' or GetResourceState('es_extended') == 'started' and 'esx' or 'custom' -- qb, esx or custom - if you want to use a standalone make sure to set this to custom and change the sv_utils.lua functions

Config.ScoreboardType = 'fullscreen' -- fullscreen or card

Config.ScoreboardCommand = 'openscoreboard' -- Command to open the scoreboard menu

Config.RegisterKeyMapping = true -- If you want to register a key mapping for the scoreboard, set this to true

Config.OpenScoreboardKey = 'F10' -- Key to open the scoreboard menu

Config.MaxServerPlayers = 32 -- Max server players if you sv_maxclients on `server.cfg` is not set, make sure its "setr sv_maxclients 32"

Config.UseOkokBossMenu = GetResourceState('okokBossMenu') == 'started' and true or false -- If you want to use okokBossMenu, set this to true

Config.Services = {
    {
        icon = 'fa-solid fa-heart-pulse',
        name = 'ambulance',
        label = 'Medics',
        color = '#FF1F8B',
        iconColor = '#fff',
    },
    {
        icon = 'fa-solid fa-shield-halved',
        name = 'police',
        label = 'LSPD',
        color = '#007CFF',
        iconColor = '#fff',
    },
    {
        icon = 'fa-solid fa-wrench',
        name = 'mechanic',
        label = 'Mechanic',
        color = '#ffffff',
        iconColor = '#101217',
    },
    {
        icon = 'fa-solid fa-taxi',
        name = 'taxi',
        label = 'Taxi',
        color = '#3FC157',
        iconColor = '#fff',
    },
}

Config.Admins = {
    {
        group = 'admin',
        color = '#FF0000',
        icon = 'fa-solid fa-shield-halved',
        label = 'Admin',
    },
    {
        group = 'god',
        color = '#0e65f0',
        icon = 'fa-solid fa-crown',
        label = 'Founder',
    },
    {
        group = 'mod',
        color = '#ebd728',
        icon = 'fa-solid fa-user-secret',
        label = 'Mod',
    },
}
```


# okokVehicleControl

[**YouTube Video**](https://www.youtube.com/watch?v=10-L1395Fg4)

## Installation Guide

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>

### Open Menu Event

```lua
okokVehicleControl:OpenMenu
```


# Config file

```lua
Config, Locales = {}, {}

Config.Locale = 'en'

Config.CommandName = "vehiclecontrol"
Config.CommandDesc = "Opens the vehicle control menu"
Config.CommandBind = "F3"

Config.BlacklistedVehicles = { -- Blacklist vehicles from opening the menu via their class
    13, -- Bikes
}

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale] == nil then
		return nil
	elseif Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```


# okokMechanicJob

[**YouTube Video**](https://www.youtube.com/watch?v=ij8YKjNB-Fw)

## Installation Guide

### Requirements:

ox\_lib **v3.16.2+** (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>).

### Execute the following SQL code in your database:

{% tabs %}
{% tab title="ESX" %}

```sql
ALTER TABLE `owned_vehicles` ADD `vehiclemileage` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `owned_vehicles` ADD `vehiclestatus` LONGTEXT DEFAULT '{"oil":0,"brakes":0,"filters":0,"battery":0, "timingbelt":0, "enginefluid":0, "tires":0, "lights":0}';
ALTER TABLE `owned_vehicles` ADD `vehiclenitrouslevel` LONGTEXT DEFAULT '{"nitrouslevel":0,"nitroustype":"none"}';
ALTER TABLE `owned_vehicles` ADD `vehiclestance` LONGTEXT DEFAULT NULL;
ALTER TABLE `owned_vehicles` ADD `vehicleengine` LONGTEXT DEFAULT '{"engine":"stock","defaultspeed":0}';
ALTER TABLE `owned_vehicles` ADD `vehicletuning` LONGTEXT DEFAULT '{"defaultboost":0, "boost":0, "defaultacceleration":0, "acceleration":0, "defaultgear":0,"gear":0, "defaultdrivetrain":0, "drivetrain":"0","defaultbrake":0, "brake":0, "smoke":false, "pops":false, "driftmode":false}';

INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES ('oil', 'Oil', 0, 0, 1), ('brakes', 'Brakes', 0, 0, 1), ('filters', 'Filters', 0, 0, 1), ('battery', 'Battery', 0, 0, 1), ('engine', 'Engine', 250, 0, 1), ('timingbelt', 'Timing Belt', 0, 0, 1), ('enginefluid', 'Engine Fluid', 0, 0, 1), ('tire', 'Tire', 0, 0, 1), ('cleaningkit', 'Cleaning Kit', 250, 0, 1), ('dynoprintout', 'Dyno Printout', 250, 0, 1), ('lights', 'Lights', 250, 0, 1), ('nitrousrecharge', 'Nitrous Recharge', 250, 0, 1);
```

{% endtab %}

{% tab title="QBCore" %}

```sql
ALTER TABLE `player_vehicles` ADD `vehiclemileage` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `player_vehicles` ADD `vehiclestatus` LONGTEXT DEFAULT '{"oil":0,"brakes":0,"filters":0,"battery":0, "timingbelt":0, "enginefluid":0, "tires":0, "lights":0}';
ALTER TABLE `player_vehicles` ADD `vehiclenitrouslevel` LONGTEXT DEFAULT '{"nitrouslevel":0,"nitroustype":"none"}';
ALTER TABLE `player_vehicles` ADD `vehiclestance` LONGTEXT DEFAULT NULL;
ALTER TABLE `player_vehicles` ADD `vehicleengine` LONGTEXT DEFAULT '{"engine":"stock","defaultspeed":0}';
ALTER TABLE `player_vehicles` ADD `vehicletuning` LONGTEXT DEFAULT '{"defaultboost":0, "boost":0, "defaultacceleration":0, "acceleration":0, "defaultgear":0,"gear":0, "defaultdrivetrain":0, "drivetrain":"0","defaultbrake":0, "brake":0, "smoke":false, "pops":false, "driftmode":false}';
```

{% endtab %}
{% endtabs %}

### Update setVehicleProperties function

#### ESX

Navigate to **es\_extended/client/functions.lua** and add the following code inside the `setVehicleProperties` function:

```lua
exports['okokMechanicJob']:setVehicleProperties(vehicle)
```

#### QBCore

Navigate to **qb-core/client/functions.lua** and add the following code inside the `setVehicleProperties` function:

```lua
exports['okokMechanicJob']:setVehicleProperties(vehicle)
```

### QBCORE ONLY

Add Item:

```lua
oil = { name = 'oil', label = 'Oil', weight = 0, type = 'item', image = 'oil.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = '' },
brakes = { name = 'brakes', label = 'Brakes', weight = 0, type = 'item', image = 'brakes.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = '' },
filters = { name = 'filters', label = 'Filters', weight = 0, type = 'item', image = 'filters.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = '' },
battery = { name = 'battery', label = 'Battery', weight = 0, type = 'item', image = 'battery.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = '' },
engine = { name = 'engine', label = 'Engine', weight = 250, type = 'item', image = 'engine.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'Engine to replace on your vehicle' },
timingbelt = { name = 'timingbelt', label = 'Timing Belt', weight = 0, type = 'item', image = 'timingbelt.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = '' },
enginefluid = { name = 'enginefluid', label = 'Engine Fluid', weight = 0, type = 'item', image = 'enginefluid.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = '' },
tire = { name = 'tire', label = 'Tire', weight = 0, type = 'item', image = 'tire.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = '' },
cleaningkit = { name = 'cleaningkit', label = 'Cleaning Kit', weight = 250, type = 'item', image = 'cleaningkit.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = 'A microfiber cloth with some soap will let your car sparkle again!' },
dynoprintout = { name = 'dynoprintout', label = 'Dyno Printout', weight = 250, type = 'item', image = 'dynoprintout.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'A dyno comprovative of your vehicle performance' },
lights = { name = 'lights', label = 'Lights', weight = 250, type = 'item', image = 'lights.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'Lights to replace on your vehicle' },
nitrousrecharge = { name = 'nitrousrecharge', label = 'Nitrous Recharge', weight = 250, type = 'item', image = 'nitrousrecharge.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'Recharge for your nitrous bottle' },
```

### OX Inventory Items

```lua
["oil"] = {label = "Oil", weight = 120, stack = true, close = true},
["brakes"] = {label = "brakes", weight = 120, stack = true, close = true},
["filters"] = {label = "Filter", weight = 120, stack = true, close = true},
["battery"] = {label = "Battery", weight = 120, stack = true, close = true},
["timingbelt"] = {label = "Timing belt", weight = 120, stack = true, close = true},
["enginefluid"] = {label = "Engine fluid", weight = 120, stack = true, close = true},
["tire"] = {label = "Tire", weight = 120, stack = true, close = true},
["cleaningkit"] = {label = "Cleaning kit", weight = 120, stack = true, close = true},
["repairkit"] = {label = "Repair kit", weight = 120, stack = true, close = true},
["advancedrepairkit"] = {label = "Advanced repair kit", weight = 120, stack = true, close = true},
["nitrous"] = {label = "Nitrous", weight = 120, stack = true, close = true},
["nitrousrecharge"] = {label = "Nitrous Recharge", weight = 120, stack = true, close = true},
["engine"] = {label = "Engine", weight = 120, stack = true, close = true},
["lights"] = {label = "Lights", weight = 120, stack = true, close = true},
["dynoprintout"] = {label = "Dyno Printout", weight = 120, stack = false, close = true},
```

### Flatbed

{% embed url="<https://github.com/flowdgodx/flatbed>" %}

### Recommended Sound Pack

{% embed url="<https://github.com/SpiritsCreations/FiveM-Engine-Sound-Pack>" %}


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Debug = false -- true = Debug mode / false = Normal mode

Config.Locale = 'en' -- en / pt (not yet) / es (not yet) / fr (not yet) / de (not yet)

Config.UseOkokTextUI = true -- true = Use okokTextUI / false = Use ESX TextUI

Config.UseOkokNotify = true -- true = Use okokNotify / false = Use ESX Notify

Config.UseOkokGarage = false -- true = Use okokGarage / false = Use config settings

Config.UseOkokBilling = true -- true = Use okokBilling / false = Implement your own billing system

Config.UseOkokGasStation = true -- true = Use okokGasStation / false = Implement your own gas station system

Config.UseTarget = true -- true = Use target system / false = Use TextUI

Config.UseKMH = true -- true = Use KMH / false = Use MPH

Config.Currency = '€' -- The currency used on the script

Config.ContextMenuSystem = 'okok-menu' -- Context menu system ( okok-menu / ox-menu )

Config.TargetSystem = 'ox-target' -- Target system ( ox-target )

Config.KeySystem = 'qs-vehiclekeys' -- Key system ( 'wasabi-keys' / 'qs-vehiclekeys' / 'jaksam-keys' )

Config.ClothingSystem = 'esx-skin' -- Clothing system ( 'esx-skin' / 'illenium-appearance' )

Config.InventorySystem = 'qs-inventory' -- Inventory system ( 'ox-inventory' / 'qs-inventory' )

Config.OpenMechanicMenuComand = 'mechanicmenu' -- Command to open the mechanic menu

Config.TrashName = 'mechanictrash' -- Trash name

Config.StashName = 'mechanicstash' -- Stash name

Config.WarpPedIntoVehicle = false -- true = Warp ped into vehicle / false = The vehicle will be spawned near the ped

Config.SetVehicleDoorsLockedOnSpawn = false -- true = Set vehicle doors locked on spawn / false = Set vehicle doors unlocked on spawn

Config.RandomSocietyPlate = false -- true = Random society plate / false = Use the plate defined in the config

Config.CleanPartsOfVehicle = false -- true = to clean a vehicle you need to clear doors, hood and trunk / false = just clean the vehicle

Config.UseVehicleMileage = true -- true = Use vehicle mileage / false = Don't use vehicle mileage

Config.UseVehicleFailure = true -- true = The vehicle will fail based on the parts on due to be changed

Config.OpenMechanicMenuKey = 'F6' -- Key to open the mechanic menu

Config.EventPrefix = 'okokMechanicJob' -- Event prefix

Config.PhoneNumberFormat = 'xxx xxx xxx' -- Phone number format

Config.PlacePropKey = 38 -- Key to place a prop (E)

Config.RemovePropKey = 177 -- Key to remove a prop (BACKSPACE)

Config.MechanicJobs = { 'mechanic' } -- Jobs that can use the mechanic menu

Config.MarkerID = 21 -- The marker ID for the job locations

Config.VehicleMarker = 36 -- The marker ID for the vehicle locations

Config.MarkerColors = { r = 31, g = 94, b = 255, a = 90 } -- The marker colors for the job locations

Config.StoreMarkerColors = { r = 255, g = 0, b = 0, a = 90 } -- The marker colors for the vehicle locations

Config.RepairKitItem = 'repairkit' -- The kit name

Config.AdvancedRepairKitItem = 'advancedrepairkit' -- The advanced kit name

Config.NitrousItem = 'nitrous' -- The nitrous name

Config.RechargeNitrousItem = 'nitrousrecharge' -- The recharge nitrous name

Config.EngineItem = 'engine' -- The engine name

Config.DynoPrintoutItem = 'dynoprintout' -- The dyno printout name

Config.CleaningKit = 'cleaningkit' -- The cleaning kit name

Config.NitrousVehicleBoostSpeed = 2.4 -- How much speed is added to the vehicle when using nitrous

Config.NitrousUsage = 0.15 -- How much nitrous is used when holding the key

Config.SmokeIntensity = 5 -- The intensity of the smoke

Config.EnableBurnoutOnDyno = true -- true = Enable burnout on dyno / false = Disable burnout on dyno

Config.TunerChipMultipliers = {
	boost = 0.24,
	braking = 2.85,
	acceleration = 0.22,
	gearchange = 0.35,
}

Config.PopsAndBangs = {
	waitTime = math.random(100, 300),
	minRPM = 0.5,
	maxRPM = 0.8,
}

Config.CarJackPositionFix = { -- If the position of the car jack is wrong for some vehicles, you can fix it here
	['brioso2'] = {
		frontleft = vector3(0.65, -0.8, 0.0),
		frontright = vector3(0.65, 0.8, 0.0),
		backleft = vector3(-0.65, -0.8, 0.0),
		backright = vector3(-0.65, 0.8, 0.0),
	},
	['akuma'] = {
		frontleft = vector3(1.0, 0.0, 1.0),
		frontright = vector3(1.0, 0.0, 1.0),
		backleft = vector3(1.0, 0.0, 1.0),
		backright = vector3(1.0, 0.0, 1.0),
	}
}

Config.NitrousBottles = {
	[1] = { name = "nitrousv1", label = 'Nitrous V1', description = "100L Bottle with N2O | 2.4% Boost", liters = 100, boostspeed = 2.4 },
	[2] = { name = "nitrousv2", label = 'Nitrous V2', description = "200L Bottle with N2O | 3.2% Boost", liters = 200, boostspeed = 3.2 },
	[3] = { name = "nitrousv3", label = 'Nitrous V3', description = "400L Bottle with N2O | 4.8% Boost", liters = 400, boostspeed = 4.8 },
}

Config.Engines = {
	[1] = { name = "lgcy00vr6", 		label = 'V6 Engine', 	description = "V6 3.5L Engine | 1.2% Boost", 	cylinders = 6, 	boostspeed = 2.2 },
	[2] = { name = "lgcy01chargerv8", 	label = 'V8 Engine', 	description = "V8 4.6L Engine | 2.6% Boost", 	cylinders = 8, 	boostspeed = 3.6 },
	[3] = { name = "lg59hurv10", 		label = 'V10 Engine', 	description = "V10 5.5L Engine | 4.12% Boost", 	cylinders = 10, boostspeed = 7.12 },
	[4] = { name = "lg87skodar5rally", 	label = 'V12 Engine', 	description = "V12 6.4L Engine | 6.4% Boost", 	cylinders = 12, boostspeed = 12.4 },
}

Config.PartsDistance = { -- The distance to repair the parts of the vehicle, it resets after repairing it
	oil = { item = "oil", canchange = 5000, onlimit = 15000, due = 25000 }, -- canchange = after how much distance you can change the part, onlimit = when the part is on the limit, due = when the part is due
	tires = { item = "tire", canchange = 20000, onlimit = 35000, due = 45000 },
	brakes = { item = "brakes", canchange = 30000, onlimit = 50000, due = 60000 },
	filters = { item = "filters", canchange = 10000, onlimit = 20000, due = 30000 },
	battery = { item = "battery", canchange = 60000, onlimit = 80000, due = 100000 },
	timingbelt = { item = "timingbelt", canchange = 100000, onlimit = 120000, due = 150000 },
	enginefluid = { item = "enginefluid", canchange = 15000, onlimit = 30000, due = 32500 },
	lights = { item = "lights", canchange = 17500, onlimit = 22250, due = 27500 },
}

Config.MechanicObjects = {
	['Lights'] = {
		['Light'] = 'prop_worklight_01a',
		['Light 2'] = 'prop_worklight_02a',
	},
	['Cones'] = {
		['Cone'] = 'prop_roadcone02a',
		['Cone 2'] = 'prop_air_conelight'
	},
	['Barriers'] = {
		['Barrier'] = 'prop_barrier_work05',
		['Barrier 2'] = 'prop_barrier_work01a',
		['Barrier 3'] = 'prop_barrier_work02a',
		['Barrier 4'] = 'prop_barrier_work06a',
		['Barrier 5'] = 'prop_barrier_wat_03b',
		['Barrier 6'] = 'prop_consign_02a',
		['Barrier 7'] = 'prop_barrier_work04a',
	},
	['Traffic'] = {
		['Traffic'] = 'prop_trafficdiv_01',
		['Traffic 2'] = 'prop_trafficdiv_02',
	},
	['Road Poles'] = {
		['Road Pole'] = 'prop_roadpole_01a',
		['Road Pole 2'] = 'prop_roadpole_01b',
	},
	['Car Jack'] = {
		['Car Jack'] = 'imp_prop_car_jack_01a', -- don't change this prop
	},
	['Car Lift'] = {
		['Car Lift'] = 'okok_car_lift_02_a', -- don't change this prop
	},
	['Car Dynamometer'] = {
		['Car Dyno'] = 'okok_dynamometer', -- don't change this prop
	}
}

-- The vehicles location only work if Config.UseOkokGarage is false
Config.Locations = {
	vehicles = {
		[1] = {
			coords = vector4(-203.65, -1311.79, 31.27, 272.25),
			storecoords = vector4(-210.72, -1309.66, 31.29, 181.68),
			vehicles = {
				{
					model = 'towtruck', 
					label = 'Tow Truck',
					plate = 'MECHANIC',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{
					model = 'flatbed3', 
					label = 'Flat Bed',
					plate = 'MECHANIC',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{
					model = 'slamtruck', 
					label = 'Slam Truck',
					plate = 'MECHANIC',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
			},
			vehiclesSpawn = {
				vector4(-187.52, -1290.1, 31.38, 270.77),
				vector4(-187.72, -1284.43, 31.35, 270.23),
				vector4(-179.24, -1290.2, 31.38, 180.36)
			}
		},
	},
	armories = {
		[1] = {
			coords = vector3(-196.38, -1318.28, 31.09),
			items = {
				{ name = 'oil', price = 500, amount = 50, minimumGrade = 0 },
				{ name = 'brakes', price = 800, amount = 30, minimumGrade = 0 },
				{ name = 'filters', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'battery', price = 3500, amount = 20, minimumGrade = 1 },
				{ name = 'timingbelt', price = 4500, amount = 20, minimumGrade = 1 },
				{ name = 'enginefluid', price = 3000, amount = 20, minimumGrade = 1 },
				{ name = 'tire', price = 1750, amount = 20, minimumGrade = 1 },
				{ name = 'cleaningkit', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'repairkit', price = 5000, amount = 20, minimumGrade = 2 },
				{ name = 'advancedrepairkit', price = 10000, amount = 20, minimumGrade = 3 },
				{ name = 'nitrous', price = 7500, amount = 10, minimumGrade = 4 },
				{ name = 'nitrousrecharge', price = 3500, amount = 10, minimumGrade = 4 },
				{ name = 'engine', price = 15000, amount = 10, minimumGrade = 4 },
				{ name = 'lights', price = 500, amount = 10, minimumGrade = 1 },
			}
		},
	},
	cloakrooms = {
		[1] = { coords = vector3(-206.6, -1341.68, 34.89) },
	},
	stashes = {
		[1] = { coords = vector3(-196.38, -1315.23, 31.09) },
		[2] = { coords = vector3(-1196.38, -3315.23, 31.09) },
	},
	trashes = {
		[1] = { coords = vector3(-201.55, -1320.65, 31.09) },
	},
	blips = {
		{ name = 'Mechanic', color = 17, sprite = 446, scale = 0.8, coords = vector3(-212.36, -1325.44, 30.89) },
	}
}


-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.UpdateVehicleStatusWebhook = true
Config.UpdateVehicleStatusWebhookColor = '65280'

Config.UpdateNitrousWebhook = true
Config.UpdateNitrousWebhookColor = '65280'

Config.UpdateEngineWebhook = true
Config.UpdateEngineWebhookColor = '65280'

Config.UpdateTuningWebhook = true
Config.UpdateTuningWebhookColor = '65280'

Config.ResetTuningWebhook = true
Config.ResetTuningWebhookColor = '16711680'

Config.UpdateStanceWebhook = true
Config.UpdateStanceWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Debug = false -- true = Debug mode / false = Normal mode

Config.Locale = 'en' -- en / pt (not yet) / es (not yet) / fr (not yet) / de (not yet)

Config.UseOkokTextUI = true -- true = Use okokTextUI / false = Use QBCore Draw Text

Config.UseOkokNotify = true -- true = Use okokNotify / false = Use QBCore Notify

Config.UseOkokGarage = false -- true = Use okokGarage / false = Use config settings

Config.UseOkokBilling = true -- true = Use okokBilling / false = Implement your own billing system

Config.UseOkokGasStation = true -- true = Use okokGasStation / false = Implement your own gas station system

Config.UseTarget = true -- true = Use target system / false = Use TextUI

Config.UseKMH = true -- true = Use KMH / false = Use MPH

Config.Currency = '€' -- The currency used on the script

Config.ContextMenuSystem = 'okok-menu' -- Context menu system ( okok-menu / qb-menu / ox-menu )

Config.TargetSystem = 'qb-target' -- Target system ( qb-target / ox-target )

Config.KeySystem = 'qb-vehiclekeys' -- Key system ( qb-vehiclekeys / wasabi-keys / qs-vehiclekeys / jaksam-keys )

Config.ClothingSystem = 'qb-clothing' -- Clothing system ( qb-clothing / illenium-appearance )

Config.InventorySystem = 'qs-inventory' -- Inventory system ( qb-inventory / qb-inventory-new / ox-inventory / qs-inventory )

Config.OpenMechanicMenuComand = 'mechanicmenu' -- Command to open the mechanic menu

Config.TrashName = 'mechanictrash' -- Trash name

Config.StashName = 'mechanicstash' -- Stash name

Config.WarpPedIntoVehicle = false -- true = Warp ped into vehicle / false = The vehicle will be spawned near the ped

Config.SetVehicleDoorsLockedOnSpawn = false -- true = Set vehicle doors locked on spawn / false = Set vehicle doors unlocked on spawn

Config.RandomSocietyPlate = false -- true = Random society plate / false = Use the plate defined in the config

Config.CleanPartsOfVehicle = false -- true = to clean a vehicle you need to clear doors, hood and trunk / false = just clean the vehicle

Config.UseVehicleMileage = true -- true = Use vehicle mileage / false = Don't use vehicle mileage

Config.UseVehicleFailure = true -- true = The vehicle will fail based on the parts on due to be changed

Config.OpenMechanicMenuKey = 'F6' -- Key to open the mechanic menu

Config.EventPrefix = 'okokMechanicJob' -- Event prefix

Config.PhoneNumberFormat = 'xxx xxx xxx' -- Phone number format

Config.PlacePropKey = 38 -- Key to place a prop (E)

Config.RemovePropKey = 177 -- Key to remove a prop (BACKSPACE)

Config.MechanicJobs = { 'mechanic' } -- Jobs that can use the mechanic menu

Config.MarkerID = 21 -- The marker ID for the job locations

Config.VehicleMarker = 36 -- The marker ID for the vehicle locations

Config.MarkerColors = { r = 31, g = 94, b = 255, a = 90 } -- The marker colors for the job locations

Config.StoreMarkerColors = { r = 255, g = 0, b = 0, a = 90 } -- The marker colors for the vehicle locations

Config.RepairKitItem = 'repairkit' -- The kit name

Config.AdvancedRepairKitItem = 'advancedrepairkit' -- The advanced kit name

Config.NitrousItem = 'nitrous' -- The nitrous name

Config.RechargeNitrousItem = 'nitrousrecharge' -- The recharge nitrous name

Config.EngineItem = 'engine' -- The engine name

Config.DynoPrintoutItem = 'dynoprintout' -- The dyno printout name

Config.CleaningKit = 'cleaningkit' -- The cleaning kit name

Config.NitrousVehicleBoostSpeed = 2.4 -- How much speed is added to the vehicle when using nitrous

Config.NitrousUsage = 0.15 -- How much nitrous is used when holding the key

Config.SmokeIntensity = 5 -- The intensity of the smoke

Config.EnableBurnoutOnDyno = true -- true = Enable burnout on dyno / false = Disable burnout on dyno

Config.TunerChipMultipliers = {
	boost = 0.24,
	braking = 2.85,
	acceleration = 0.22,
	gearchange = 0.35,
}

Config.PopsAndBangs = {
	waitTime = math.random(100, 300),
	minRPM = 0.5,
	maxRPM = 0.8,
}

Config.CarJackPositionFix = { -- If the position of the car jack is wrong for some vehicles, you can fix it here
	['brioso2'] = {
		frontleft = vector3(0.65, -0.8, 0.0),
		frontright = vector3(0.65, 0.8, 0.0),
		backleft = vector3(-0.65, -0.8, 0.0),
		backright = vector3(-0.65, 0.8, 0.0),
	},
	['akuma'] = {
		frontleft = vector3(1.0, 0.0, 1.0),
		frontright = vector3(1.0, 0.0, 1.0),
		backleft = vector3(1.0, 0.0, 1.0),
		backright = vector3(1.0, 0.0, 1.0),
	}
}

Config.NitrousBottles = {
	[1] = { name = "nitrousv1", label = 'Nitrous V1', description = "100L Bottle with N2O | 2.4% Boost", liters = 100, boostspeed = 2.4 },
	[2] = { name = "nitrousv2", label = 'Nitrous V2', description = "200L Bottle with N2O | 3.2% Boost", liters = 200, boostspeed = 3.2 },
	[3] = { name = "nitrousv3", label = 'Nitrous V3', description = "400L Bottle with N2O | 4.8% Boost", liters = 400, boostspeed = 4.8 },
}

Config.Engines = {
	[1] = { name = "lgcy00vr6", 		label = 'V6 Engine', 	description = "V6 3.5L Engine | 1.2% Boost", 	cylinders = 6, 	boostspeed = 2.2 },
	[2] = { name = "lgcy01chargerv8", 	label = 'V8 Engine', 	description = "V8 4.6L Engine | 2.6% Boost", 	cylinders = 8, 	boostspeed = 3.6 },
	[3] = { name = "lg59hurv10", 		label = 'V10 Engine', 	description = "V10 5.5L Engine | 4.12% Boost", 	cylinders = 10, boostspeed = 7.12 },
	[4] = { name = "lg87skodar5rally", 	label = 'V12 Engine', 	description = "V12 6.4L Engine | 6.4% Boost", 	cylinders = 12, boostspeed = 12.4 },
}

Config.PartsDistance = { -- The distance to repair the parts of the vehicle, it resets after repairing it
	oil = { item = "oil", canchange = 5000, onlimit = 15000, due = 25000 }, -- canchange = after how much distance you can change the part, onlimit = when the part is on the limit, due = when the part is due
	tires = { item = "tire", canchange = 20000, onlimit = 35000, due = 45000 },
	brakes = { item = "brakes", canchange = 30000, onlimit = 50000, due = 60000 },
	filters = { item = "filters", canchange = 10000, onlimit = 20000, due = 30000 },
	battery = { item = "battery", canchange = 60000, onlimit = 80000, due = 100000 },
	timingbelt = { item = "timingbelt", canchange = 100000, onlimit = 120000, due = 150000 },
	enginefluid = { item = "enginefluid", canchange = 15000, onlimit = 30000, due = 32500 },
	lights = { item = "lights", canchange = 17500, onlimit = 22250, due = 27500 },
}

Config.MechanicObjects = {
	['Lights'] = {
		['Light'] = 'prop_worklight_01a',
		['Light 2'] = 'prop_worklight_02a',
	},
	['Cones'] = {
		['Cone'] = 'prop_roadcone02a',
		['Cone 2'] = 'prop_air_conelight'
	},
	['Barriers'] = {
		['Barrier'] = 'prop_barrier_work05',
		['Barrier 2'] = 'prop_barrier_work01a',
		['Barrier 3'] = 'prop_barrier_work02a',
		['Barrier 4'] = 'prop_barrier_work06a',
		['Barrier 5'] = 'prop_barrier_wat_03b',
		['Barrier 6'] = 'prop_consign_02a',
		['Barrier 7'] = 'prop_barrier_work04a',
	},
	['Traffic'] = {
		['Traffic'] = 'prop_trafficdiv_01',
		['Traffic 2'] = 'prop_trafficdiv_02',
	},
	['Road Poles'] = {
		['Road Pole'] = 'prop_roadpole_01a',
		['Road Pole 2'] = 'prop_roadpole_01b',
	},
	['Car Jack'] = {
		['Car Jack'] = 'imp_prop_car_jack_01a', -- don't change this prop
	},
	['Car Lift'] = {
		['Car Lift'] = 'okok_car_lift_02_a', -- don't change this prop
	},
	['Car Dynamometer'] = {
		['Car Dyno'] = 'okok_dynamometer', -- don't change this prop
	}
}

-- The vehicles location only work if Config.UseOkokGarage is false
Config.Locations = {
	vehicles = {
		[1] = {
			coords = vector4(-203.65, -1311.79, 31.27, 272.25),
			storecoords = vector4(-210.72, -1309.66, 31.29, 181.68),
			vehicles = {
				{
					model = 'towtruck', 
					label = 'Tow Truck',
					plate = 'MECHANIC',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{
					model = 'flatbed3', 
					label = 'Flat Bed',
					plate = 'MECHANIC',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{
					model = 'slamtruck', 
					label = 'Slam Truck',
					plate = 'MECHANIC',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
			},
			vehiclesSpawn = {
				vector4(-187.52, -1290.1, 31.38, 270.77),
				vector4(-187.72, -1284.43, 31.35, 270.23),
				vector4(-179.24, -1290.2, 31.38, 180.36)
			}
		},
	},
	armories = {
		[1] = {
			coords = vector3(-196.38, -1318.28, 31.09),
			items = {
				{ name = 'oil', price = 500, amount = 50, minimumGrade = 0 },
				{ name = 'brakes', price = 800, amount = 30, minimumGrade = 0 },
				{ name = 'filters', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'battery', price = 3500, amount = 20, minimumGrade = 1 },
				{ name = 'timingbelt', price = 4500, amount = 20, minimumGrade = 1 },
				{ name = 'enginefluid', price = 3000, amount = 20, minimumGrade = 1 },
				{ name = 'tire', price = 1750, amount = 20, minimumGrade = 1 },
				{ name = 'cleaningkit', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'repairkit', price = 5000, amount = 20, minimumGrade = 2 },
				{ name = 'advancedrepairkit', price = 10000, amount = 20, minimumGrade = 3 },
				{ name = 'nitrous', price = 7500, amount = 10, minimumGrade = 4 },
				{ name = 'nitrousrecharge', price = 3500, amount = 10, minimumGrade = 4 },
				{ name = 'engine', price = 15000, amount = 10, minimumGrade = 4 },
				{ name = 'lights', price = 500, amount = 10, minimumGrade = 1 },
			}
		},
	},
	cloakrooms = {
		[1] = { coords = vector3(-206.6, -1341.68, 34.89) },
	},
	stashes = {
		[1] = { coords = vector3(-196.38, -1315.23, 31.09) },
		[2] = { coords = vector3(-1196.38, -3315.23, 31.09) },
	},
	trashes = {
		[1] = { coords = vector3(-201.55, -1320.65, 31.09) },
	},
	blips = {
		{ name = 'Mechanic', color = 17, sprite = 446, scale = 0.8, coords = vector3(-212.36, -1325.44, 30.89) },
	}
}


-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.UpdateVehicleStatusWebhook = true
Config.UpdateVehicleStatusWebhookColor = '65280'

Config.UpdateNitrousWebhook = true
Config.UpdateNitrousWebhookColor = '65280'

Config.UpdateEngineWebhook = true
Config.UpdateEngineWebhookColor = '65280'

Config.UpdateTuningWebhook = true
Config.UpdateTuningWebhookColor = '65280'

Config.ResetTuningWebhook = true
Config.ResetTuningWebhookColor = '16711680'

Config.UpdateStanceWebhook = true
Config.UpdateStanceWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}
{% endtabs %}


# okokPoliceJob

[**YouTube Video**](https://www.youtube.com/watch?v=B6PtiHMyYlk)

## Installation Guide

### Requirements:

ox\_lib **v3.16.2+** (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>).

### Execute the following SQL code in your database:

{% tabs %}
{% tab title="ESX" %}

```sql
CREATE TABLE IF NOT EXISTS `okokpolicejob_reports` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `reporter` VARCHAR(255) NOT NULL,
    `phone` VARCHAR(255) NOT NULL,
    `date` VARCHAR(255) NOT NULL,
    `description` TEXT NOT NULL,
    `status` INT NOT NULL DEFAULT '0'
);

ALTER TABLE `users` 
DROP COLUMN IF EXISTS `ankleMonitor`,
ADD COLUMN `ankleMonitor` BOOLEAN NOT NULL DEFAULT '0',
DROP COLUMN IF EXISTS `isHandcuffed`,
ADD COLUMN `isHandcuffed` BOOLEAN NOT NULL DEFAULT '0',
DROP COLUMN IF EXISTS `jailTime`,
ADD COLUMN `jailTime` INT NOT NULL DEFAULT '0',
DROP COLUMN IF EXISTS `communityService`,
ADD COLUMN `communityService` INT NOT NULL DEFAULT '0';

INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES ('handcuffs', 'Handcuffs', 1, 1, 1);
```

{% endtab %}

{% tab title="QBCore" %}

```sql
CREATE TABLE IF NOT EXISTS `okokpolicejob_reports` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `reporter` VARCHAR(255) NOT NULL,
    `phone` VARCHAR(255) NOT NULL,
    `date` VARCHAR(255) NOT NULL,
    `description` TEXT NOT NULL,
    `status` INT NOT NULL DEFAULT '0'
);

ALTER TABLE `players` 
DROP COLUMN IF EXISTS `ankleMonitor`,
ADD COLUMN `ankleMonitor` BOOLEAN NOT NULL DEFAULT '0',
DROP COLUMN IF EXISTS `isHandcuffed`,
ADD COLUMN `isHandcuffed` BOOLEAN NOT NULL DEFAULT '0',
DROP COLUMN IF EXISTS `jailTime`,
ADD COLUMN `jailTime` INT NOT NULL DEFAULT '0',
DROP COLUMN IF EXISTS `communityService`,
ADD COLUMN `communityService` INT NOT NULL DEFAULT '0';
```

{% endtab %}
{% endtabs %}

### QBCORE ONLY

Add Item:

```lua
handcuffs = { name = 'handcuffs', label = 'Handcuffs', weight = 100, type = 'item', image = 'handcuffs.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = 'Handcuffs' },
```

If using **qb-clothing**, add the following code on client/main.lua, after `exports('getOutfits',getOutfits)`:

```lua
local function getJobOutfits(gradeLevel, requiredJob)
    local data = Config.Outfits[requiredJob]
    local gender = "male"
    if QBCore.Functions.GetPlayerData().charinfo.gender == 1 then gender = "female" end
    QBCore.Functions.TriggerCallback('qb-clothing:server:getOutfits', function(result)
        openMenu({
            {menu = "roomOutfits", label = Lang:t("outfits.roomOutfits"), selected = true, outfits = data[gender][gradeLevel]},
            {menu = "myOutfits", label = Lang:t("outfits.myOutfits"), selected = false, outfits = result},
            {menu = "character", label = Lang:t("outfits.character"), selected = false},
            {menu = "accessoires", label = Lang:t("outfits.accessoires"), selected = false}
        })
    end)
end
exports('getJobOutfits', getJobOutfits)
```

### Server artifacts

Make sure your server artifacts version is up to date.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt (not yet) / es (not yet) / fr (not yet) / de (not yet)

Config.UseOkokTextUI = true -- true = Use okokTextUI / false = Use ESX TextUI

Config.UseOkokNotify = true -- true = Use okokNotify / false = Use ESX Notify
  
Config.UseOkokGarage = false -- true = Use okokGarage / false = Use config settings

Config.UseOkokBilling = true -- true = Use okokBilling / false = Implement your own billing system

Config.UseOkokGasStation = true -- true = Use okokGasStation / false = Implement your own gas station system

Config.UseTarget = true -- true = Use target system / false = Use TextUI

Config.UseInteractSound = false -- true = Use interact sound / false = Don't use interact sound ( https://github.com/qbcore-framework/interact-sound )

Config.BillPlateOwner = true -- true = Bill the owner of the vehicle / false = Bill the player who is driving the vehicle

Config.ShowRadarsOnMap = true -- true = Show radars on map / false = Don't show radars on map

Config.UseKMH = true -- true = Use KMH / false = Use MPH

Config.OpenPoliceMenuComand = 'policemenu' -- Command to open the police menu

Config.OpenPoliceMenuKey = 'F6' -- Key to open the police menu

Config.EventPrefix = 'okokPoliceJob' -- Event prefix

Config.ContextMenuSystem = 'okok-menu' -- Context menu system ( 'okok-menu' / 'ox-menu' )

Config.TargetSystem = 'ox-target' -- Target system ( 'ox-target' )

Config.InventorySystem = 'ox-inventory' -- Inventory system ( 'ox-inventory' )

Config.ClothingSystem = 'esx-skin' -- Clothing system ( 'esx-skin' / 'illenium-appearance' )

Config.HandcuffItem = 'handcuffs' -- Handcuff item name

Config.PhoneNumberFormat = 'xxx xxx xxx' -- Phone number format

Config.KeySystem = 'qs-vehiclekeys' -- Key system ( 'wasabi-keys' / 'qs-vehiclekeys' / 'jaksam-keys' )

Config.TrashName = 'policetrash' -- Trash name

Config.StashName = 'policestash' -- Stash name

Config.EvidencesName = 'policeevidences' -- Evidences name

Config.EscortOnlyIfHandcuffed = false -- true = Only escort if handcuffed / false = Escort without handcuffed

Config.WarpPedIntoVehicle = false -- true = Warp ped into vehicle / false = The vehicle will be spawned near the ped

Config.SetVehicleDoorsLockedOnSpawn = false -- true = Set vehicle doors locked on spawn / false = Set vehicle doors unlocked on spawn

Config.RandomSocietyPlate = false -- true = Random society plate / false = Use the plate defined in the config

Config.PlacePropKey = 38 -- Key to place a prop (E)

Config.RemovePropKey = 177 -- Key to remove a prop (BACKSPACE)

Config.TackleKeys = { 21, 38 } -- Keys to tackle a player (SHIFT + E)

Config.PoliceJobs = { 'police', 'sheriff' }

Config.MarkerID = 21 -- The marker ID for the job locations

Config.VehicleMarker = 36 -- The marker ID for the vehicle locations

Config.HelicopterMarker = 34 -- The marker ID for the helicopter locations

Config.BoatMarker = 35 -- The marker ID for the boat locations

Config.MarkerColors = { r = 31, g = 94, b = 255, a = 90 } -- The marker colors for the job locations

Config.StoreMarkerColors = { r = 255, g = 0, b = 0, a = 90 } -- The marker colors for the vehicle locations

Config.RemoveOwnOfficerBlip = true -- true = Remove own officer blip / false = Keep own officer blip

Config.UpdateJobBlipsInterval = 1 -- The interval to update the officer blips in seconds, lower values can cause performance issues

Config.RemoveItemsOnJail = true -- true = Remove items on jail / false = Keep items on jail

Config.CommunityServiceMaxDistance = 100 -- if the player is more than 100 meters away from the community service location, the player will be teleported to the location

Config.CommunityServiceAddedMonths = 5 -- the months added to the player's sentence if he tries to escape from the community service location

Config.HandsUpAnimation = { dict = 'missminuteman_1ig_2', anim = 'handsup_base' } -- The hands up animation

Config.PoliceObjects = {
	['Lights'] = {
		['Light'] = 'prop_worklight_01a',
		['Light 2'] = 'prop_worklight_02a',
	},
	['Cones'] = {
		['Cone'] = 'prop_roadcone02a',
		['Cone 2'] = 'prop_air_conelight'
	},
	['Barriers'] = {
		['Barrier'] = 'prop_barrier_work05',
		['Barrier 2'] = 'prop_barrier_work01a',
		['Barrier 3'] = 'prop_barrier_work02a',
		['Barrier 4'] = 'prop_barrier_work06a',
		['Barrier 5'] = 'prop_barrier_wat_03b',
		['Barrier 6'] = 'prop_consign_02a',
		['Barrier 7'] = 'prop_barrier_work04a',
	},
	['Traffic'] = {
		['Traffic'] = 'prop_trafficdiv_01',
		['Traffic 2'] = 'prop_trafficdiv_02',
	},
	['Road Poles'] = {
		['Road Pole'] = 'prop_roadpole_01a',
		['Road Pole 2'] = 'prop_roadpole_01b',
	},
	['Spikes'] = {
		['Spike'] = 'p_ld_stinger_s'
	},
	['CCTVS'] = {
		['CCTV 1'] = 'hei_prop_bank_cctv_01',
		['CCTV 2'] = 'prop_cctv_cam_01a',
		['CCTV 3'] = 'prop_cctv_cam_04b',
	},
	['Radars'] = {
		['Radar 1'] = 'prop_cctv_cam_03a',
		['Radar 2'] = 'prop_cctv_cam_05a',
		['Radar 3'] = 'prop_cctv_pole_04',
		['Radar Signal'] = 'okok_radar_sign', -- don't change the prop otherwise it won't work
	},
	['Evidence'] = {
		['Evidence 1'] = 'okok_prop_evidence_01',
		['Evidence 2'] = 'okok_prop_evidence_02',
		['Evidence 3'] = 'okok_prop_evidence_03',
		['Evidence 4'] = 'okok_prop_evidence_04',
		['Evidence 5'] = 'okok_prop_evidence_05',
	},
}

Config.PositionFix = {
    { name = 'hei_prop_bank_cctv_01', height = 0.35, subtractHeight = true, heading = 180, sutractHeading = false },
	{ name = 'prop_cctv_cam_04b', height = 0.35, subtractHeight = true, heading = 180, sutractHeading = false },
	{ name = 'prop_cctv_cam_01a', height = 0.0, subtractHeight = false, heading = 180, sutractHeading = false },
	{ name = 'prop_cctv_cam_03a', height = 0.15, subtractHeight = true, heading = 135, sutractHeading = true },
	{ name = 'prop_cctv_cam_05a', height = 0.55, subtractHeight = true, heading = 90, sutractHeading = false },
	{ name = 'prop_cctv_pole_04', height = 0.05, subtractHeight = true, heading = 90, sutractHeading = false },
}

Config.CCTVCategory = 'CCTVS' -- Make sure this category is the SAME as the one in the Config.PoliceObjects

Config.RadarsCategory = 'Radars' -- Make sure this category is the SAME as the one in the Config.PoliceObjects

Config.Prison = {
	enter = vector4(1680.32, 2513.02, 45.56, 320.26),
	exit = vector4(1846.9, 2585.94, 45.67, 268.35),
}

Config.PrisonActions = {
	[1] = { coords = vector3(1673.12, 2510.93, 45.56), action = 'clean', actiontime = 10 }, 
	[2] = { coords = vector3(1689.5, 2515.9, 45.56), action = 'clean', actiontime = 10 },
	[3] = { coords = vector3(1713.56, 2519.59, 45.56), action = 'clean', actiontime = 10 },
	[4] = { coords = vector3(1718.44, 2527.8, 45.56), action = 'repair', actiontime = 15 },
	[5] = { coords = vector3(1761.47, 2540.47, 45.56), action = 'repair', actiontime = 15 },
	[6] = { coords = vector3(1664.82, 2501.58, 45.56), action = 'repair', actiontime = 15 },
}

Config.CommunityService = {
	enter = vector4(427.52, -979.5, 30.71, 88.87),
	exit = vector4(427.52, -979.5, 30.71, 88.87),
}

Config.CommunityServiceActions = {
	[1] = { coords = vector3(425.66, -972.5, 30.71), action = 'clean', actiontime = 10 }, 
	[2] = { coords = vector3(431.9, -972.79, 30.71), action = 'clean', actiontime = 10 },
	[3] = { coords = vector3(423.07, -974.36, 30.71), action = 'clean', actiontime = 10 },
	[4] = { coords = vector3(422.97, -978.89, 30.71), action = 'clean', actiontime = 15 },
	[5] = { coords = vector3(422.85, -983.29, 30.71), action = 'clean', actiontime = 15 },
	[6] = { coords = vector3(418.15, -988.54, 29.37), action = 'repair', actiontime = 15 },
	[7] = { coords = vector3(424.22, -995.87, 30.71), action = 'repair', actiontime = 15 },
	[8] = { coords = vector3(435.86, -976.8, 30.72), action = 'repair', actiontime = 15 },
}

Config.SpeedFines = {
	{ speed = 80, fine = 100 },
	{ speed = 100, fine = 200 },
	{ speed = 120, fine = 300 },
	{ speed = 140, fine = 400 },
	{ speed = 160, fine = 500 },
	{ speed = 180, fine = 600 },
	{ speed = 200, fine = 700 },
	{ speed = 220, fine = 800 },
	{ speed = 240, fine = 900 },
	{ speed = 260, fine = 1000 },
}

-- The vehicles, helicopters and boats locations only work if Config.UseOkokGarage is false
Config.Locations = {
	vehicles = {
		[1] = {
			coords = vector4(458.78, -1017.26, 28.18, 271.5),
			storecoords = vector4(463.04, -1019.64, 27.7, 271.0),
			vehicles = {
				{ 
					model = 'police', 
					label = 'Police Cruiser',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police2', 
					label = 'Police Interceptor',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police3', 
					label = 'Police Interceptor (2)',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police4', 
					label = 'Police Buffalo',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
			},
			vehiclesSpawn = {
				vector4(446.06, -1025.76, 28.25, 3.14),
				vector4(442.54, -1025.98, 28.31, 2.84),
				vector4(438.59, -1026.44, 28.39, 5.22)
			}
		},
		[2] = {
			coords = vector4(-446.49, 6041.74, 31.34, 44.06),
			storecoords = vector4(-445.58, 6048.27, 31.34, 36.47),
			vehicles = {
				{ 
					model = 'police', 
					label = 'Police Cruiser',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police2', 
					label = 'Police Interceptor',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police3', 
					label = 'Police Interceptor (2)',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police4', 
					label = 'Police Buffalo',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
			},
			vehiclesSpawn = {
				vector4(-452.59, 6049.98, 30.95, 219.0),
				vector4(-448.95, 6052.67, 30.95, 211.13),
				vector4(-444.72, 6054.05, 30.95, 208.19)
			}
		},
	},
	helicopters = {
		[1] = {
			coords = vector4(459.47, -981.37, 43.69, 93.83),
			storecoords = vector4(449.29, -981.21, 44.08, 94.65),
			vehicles = {
				{ model = 'polmav', label = 'Police Maverick', minimumGrade = 1, livery = 0 },
			},
			vehiclesSpawn = {
				vector4(449.29, -981.21, 44.08, 94.65),
			}
		},
		[2] = {
			coords = vector4(-467.73, 5997.28, 31.26, 133.68),
			storecoords = vector4(-474.97, 5988.99, 31.34, 141.29),
			vehicles = {
				{ model = 'polmav', label = 'Police Maverick', minimumGrade = 1, livery = 0 },
			},
			vehiclesSpawn = {
				vector4(-474.97, 5988.99, 31.34, 141.29)
			}
		},
	},
	boats = {
		[1] = {
			coords = vector4(-786.92, -1489.66, 1.6, 108.87),
			storecoords = vector4(-792.37, -1495.28, 0.59, 291.07),
			vehicles = {
				{ model = 'predator', label = 'Police Predator', minimumGrade = 1 },
			},
			vehiclesSpawn = {
				vector4(-794.18, -1486.44, 0.59, 112.32),
			}
		},
	},
	armories = {
		[1] = {
			coords = vector3(459.19, -979.0, 30.69),
			weapons = {
				{ name = 'weapon_pistol', price = 500, amount = 50, minimumGrade = 0 },
				{ name = 'weapon_stungun', price = 800, amount = 30, minimumGrade = 0 },
				{ name = 'weapon_smg', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'weapon_carbinerifle', price = 3500, amount = 15, minimumGrade = 2 },
				{ name = 'pistol_ammo', price = 50, amount = 200, minimumGrade = 0 },
				{ name = 'smg_ammo', price = 100, amount = 150, minimumGrade = 1 },
				{ name = 'rifle_ammo', price = 200, amount = 100, minimumGrade = 2 },
				{ name = 'weapon_flashlight', price = 100, amount = 100, minimumGrade = 0 },
				{ name = 'weapon_nightstick', price = 200, amount = 100, minimumGrade = 0 },
				{ name = 'radio', price = 1000, amount = 25, minimumGrade = 0 },
				{ name = 'heavyarmor', price = 1500, amount = 10, minimumGrade = 1 },
				{ name = 'handcuffs', price = 300, amount = 100, minimumGrade = 0 },
			}
		},
		[2] = {
			coords = vector3(-444.23, 6011.28, 31.72),
			weapons = {
				{ name = 'weapon_pistol', price = 500, amount = 50, minimumGrade = 0 },
				{ name = 'weapon_stungun', price = 800, amount = 30, minimumGrade = 0 },
				{ name = 'weapon_smg', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'weapon_carbinerifle', price = 3500, amount = 15, minimumGrade = 2 },
				{ name = 'pistol_ammo', price = 50, amount = 200, minimumGrade = 0 },
				{ name = 'smg_ammo', price = 100, amount = 150, minimumGrade = 1 },
				{ name = 'rifle_ammo', price = 200, amount = 100, minimumGrade = 2 },
				{ name = 'weapon_flashlight', price = 100, amount = 100, minimumGrade = 0 },
				{ name = 'weapon_nightstick', price = 200, amount = 100, minimumGrade = 0 },
				{ name = 'radio', price = 1000, amount = 25, minimumGrade = 0 },
				{ name = 'heavyarmor', price = 1500, amount = 10, minimumGrade = 1 },
				{ name = 'handcuffs', price = 300, amount = 100, minimumGrade = 0 },
			}
		}
	},
	cloakrooms = {
		[1] = { coords = vector3(454.38, -993.28, 30.69) },
		[2] = { coords = vector3(-450.06, 6016.18, 31.72) }
	},
	stashes = {
		[1] = { coords = vector3(459.01, -982.92, 30.69) },
		[2] = { coords = vector3(-441.97, 6012.77, 31.72) }
	},
	trashes = {
		[1] = { coords = vector3(439.82, -976.8, 30.69) },
		[2] = { coords = vector3(-451.18, 6011.74, 31.72) }
	},
	evidences = {
		[1] = { coords = vector3(455.27, -985.49, 30.69) },
		[2] = { coords = vector3(-446.4, 6008.88, 31.72) }
	},
	sendreports = {
		[1] = { coords = vector3(441.04, -981.15, 30.69) },
		[2] = { coords = vector3(-447.57, 6013.69, 31.72) }
	},
	openreports = {
		[1] = { coords = vector3(441.13, -978.85, 30.69) },
		[2] = { coords = vector3(-448.08, 6011.99, 31.72) }
	},
	blips = {
		{ name = 'Los Santos Station', color = 38, sprite = 137, scale = 0.8, coords = vector3(447.83, -985.41, 30.69) },
		{ name = 'Paleto Station', color = 38, sprite = 137, scale = 0.8, coords = vector3(-446.27, 6013.56, 31.72) },
		{ name = 'Prison', color = 38, sprite = 188, scale = 1.1, coords = vector3(1858.33, 2606.69, 45.67) },
	}
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.SearchPlayerWebhook = true
Config.SearchPlayerWebhookColor = '65280'

Config.JailPlayerWebhook = true
Config.JailPlayerWebhookColor = '65280'

Config.CommunityPlayerWebhook = true
Config.CommunityPlayerWebhookColor = '65280'

Config.AddAnkleWebhook = true
Config.AddAnkleWebhookColor = '65280'

Config.RemoveAnkleWebhook = true
Config.RemoveAnkleWebhookColor = '16711680'

Config.ReportsWebhook = true
Config.ReportsWebhookColor = '65280'

Config.ChangeReportWebhook = true
Config.ChangeReportWebhookColor = '65280'

Config.DeleteReportWebhook = true
Config.DeleteReportWebhookColor = '16711680'

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt (not yet) / es (not yet) / fr (not yet) / de (not yet)

Config.UseOkokTextUI = true -- true = Use okokTextUI / false = Use QBCore Draw Text

Config.UseOkokNotify = true -- true = Use okokNotify / false = Use QBCore Notify

Config.UseOkokGarage = true -- true = Use okokGarage / false = Use config settings

Config.UseOkokBilling = true -- true = Use okokBilling / false = Implement your own billing system

Config.UseOkokGasStation = true -- true = Use okokGasStation / false = Implement your own gas station system

Config.UseTarget = true -- true = Use target system / false = Use TextUI

Config.UseInteractSound = false -- true = Use interact sound / false = Don't use interact sound ( https://github.com/qbcore-framework/interact-sound )

Config.BillPlateOwner = false -- true = Bill the owner of the vehicle / false = Bill the player who is driving the vehicle

Config.ShowRadarsOnMap = true -- true = Show radars on map / false = Don't show radars on map

Config.UseKMH = true -- true = Use KMH / false = Use MPH

Config.OpenPoliceMenuComand = 'policemenu' -- Command to open the police menu

Config.OpenPoliceMenuKey = 'F6' -- Key to open the police menu

Config.EventPrefix = 'okokPoliceJob' -- Event prefix

Config.ContextMenuSystem = 'okok-menu' -- Context menu system ( 'okok-menu' / 'qb-menu' / 'ox-menu' )

Config.TargetSystem = 'qb-target' -- Target system ( 'qb-target' / 'ox-target' )

Config.InventorySystem = 'qb-inventory' -- Inventory system ( 'qb-inventory' / 'qb-inventory-new' / 'ox-inventory' )

Config.ClothingSystem = 'qb-clothing' -- Clothing system ( 'qb-clothing' / 'illenium-appearance' )

Config.HandcuffItem = 'handcuffs' -- Handcuff item name

Config.PhoneNumberFormat = 'xxx xxx xxx' -- Phone number format

Config.KeySystem = 'qb-vehiclekeys' -- Key system ( 'qb-vehiclekeys' / 'wasabi-keys' / 'qs-vehiclekeys' / 'jaksam-keys' )

Config.TrashName = 'policetrash' -- Trash name

Config.StashName = 'policestash' -- Stash name

Config.EvidencesName = 'policeevidences' -- Evidences name

Config.EscortOnlyIfHandcuffed = false -- true = Only escort if handcuffed / false = Escort without handcuffed

Config.WarpPedIntoVehicle = false -- true = Warp ped into vehicle / false = The vehicle will be spawned near the ped

Config.SetVehicleDoorsLockedOnSpawn = false -- true = Set vehicle doors locked on spawn / false = Set vehicle doors unlocked on spawn

Config.RandomSocietyPlate = false -- true = Random society plate / false = Use the plate defined in the config

Config.PlacePropKey = 38 -- Key to place a prop (E)

Config.RemovePropKey = 177 -- Key to remove a prop (BACKSPACE)

Config.TackleKeys = { 21, 38 } -- Keys to tackle a player (SHIFT + E)

Config.PoliceJobs = { 'police', 'sheriff' }

Config.MarkerID = 21 -- The marker ID for the job locations

Config.VehicleMarker = 36 -- The marker ID for the vehicle locations

Config.HelicopterMarker = 34 -- The marker ID for the helicopter locations

Config.BoatMarker = 35 -- The marker ID for the boat locations

Config.MarkerColors = { r = 31, g = 94, b = 255, a = 90 } -- The marker colors for the job locations

Config.StoreMarkerColors = { r = 255, g = 0, b = 0, a = 90 } -- The marker colors for the vehicle locations

Config.RemoveOwnOfficerBlip = true -- true = Remove own officer blip / false = Keep own officer blip

Config.UpdateJobBlipsInterval = 1 -- The interval to update the officer blips in seconds, lower values can cause performance issues

Config.RemoveItemsOnJail = true -- true = Remove items on jail / false = Keep items on jail

Config.CommunityServiceMaxDistance = 100 -- if the player is more than 100 meters away from the community service location, the player will be teleported to the location

Config.CommunityServiceAddedMonths = 5 -- the months added to the player's sentence if he tries to escape from the community service location

Config.HandsUpAnimation = { dict = 'missminuteman_1ig_2', anim = 'handsup_base' } -- The hands up animation

Config.PoliceObjects = {
	['Lights'] = {
		['Light'] = 'prop_worklight_01a',
		['Light 2'] = 'prop_worklight_02a',
	},
	['Cones'] = {
		['Cone'] = 'prop_roadcone02a',
		['Cone 2'] = 'prop_air_conelight'
	},
	['Barriers'] = {
		['Barrier'] = 'prop_barrier_work05',
		['Barrier 2'] = 'prop_barrier_work01a',
		['Barrier 3'] = 'prop_barrier_work02a',
		['Barrier 4'] = 'prop_barrier_work06a',
		['Barrier 5'] = 'prop_barrier_wat_03b',
		['Barrier 6'] = 'prop_consign_02a',
		['Barrier 7'] = 'prop_barrier_work04a',
	},
	['Traffic'] = {
		['Traffic'] = 'prop_trafficdiv_01',
		['Traffic 2'] = 'prop_trafficdiv_02',
	},
	['Road Poles'] = {
		['Road Pole'] = 'prop_roadpole_01a',
		['Road Pole 2'] = 'prop_roadpole_01b',
	},
	['Spikes'] = {
		['Spike'] = 'p_ld_stinger_s'
	},
	['CCTVS'] = {
		['CCTV 1'] = 'hei_prop_bank_cctv_01',
		['CCTV 2'] = 'prop_cctv_cam_01a',
		['CCTV 3'] = 'prop_cctv_cam_04b',
	},
	['Radars'] = {
		['Radar 1'] = 'prop_cctv_cam_03a',
		['Radar 2'] = 'prop_cctv_cam_05a',
		['Radar 3'] = 'prop_cctv_pole_04',
		['Radar Signal'] = 'okok_radar_sign', -- don't change the prop otherwise it won't work
	},
	['Evidence'] = {
		['Evidence 1'] = 'okok_prop_evidence_01',
		['Evidence 2'] = 'okok_prop_evidence_02',
		['Evidence 3'] = 'okok_prop_evidence_03',
		['Evidence 4'] = 'okok_prop_evidence_04',
		['Evidence 5'] = 'okok_prop_evidence_05',
	},
}

Config.PositionFix = {
    { name = 'hei_prop_bank_cctv_01', height = 0.35, subtractHeight = true, heading = 180, sutractHeading = false },
	{ name = 'prop_cctv_cam_04b', height = 0.35, subtractHeight = true, heading = 180, sutractHeading = false },
	{ name = 'prop_cctv_cam_01a', height = 0.0, subtractHeight = false, heading = 180, sutractHeading = false },
	{ name = 'prop_cctv_cam_03a', height = 0.15, subtractHeight = true, heading = 135, sutractHeading = true },
	{ name = 'prop_cctv_cam_05a', height = 0.55, subtractHeight = true, heading = 90, sutractHeading = false },
	{ name = 'prop_cctv_pole_04', height = 0.05, subtractHeight = true, heading = 90, sutractHeading = false },
}

Config.CCTVCategory = 'CCTVS' -- Make sure this category is the SAME as the one in the Config.PoliceObjects

Config.RadarsCategory = 'Radars' -- Make sure this category is the SAME as the one in the Config.PoliceObjects

Config.Prison = {
	enter = vector4(1680.32, 2513.02, 45.56, 320.26),
	exit = vector4(1846.9, 2585.94, 45.67, 268.35),
}

Config.PrisonActions = {
	[1] = { coords = vector3(1673.12, 2510.93, 45.56), action = 'clean', actiontime = 10 }, 
	[2] = { coords = vector3(1689.5, 2515.9, 45.56), action = 'clean', actiontime = 10 },
	[3] = { coords = vector3(1713.56, 2519.59, 45.56), action = 'clean', actiontime = 10 },
	[4] = { coords = vector3(1718.44, 2527.8, 45.56), action = 'repair', actiontime = 15 },
	[5] = { coords = vector3(1761.47, 2540.47, 45.56), action = 'repair', actiontime = 15 },
	[6] = { coords = vector3(1664.82, 2501.58, 45.56), action = 'repair', actiontime = 15 },
}

Config.CommunityService = {
	enter = vector4(427.52, -979.5, 30.71, 88.87),
	exit = vector4(427.52, -979.5, 30.71, 88.87),
}

Config.CommunityServiceActions = {
	[1] = { coords = vector3(425.66, -972.5, 30.71), action = 'clean', actiontime = 10 }, 
	[2] = { coords = vector3(431.9, -972.79, 30.71), action = 'clean', actiontime = 10 },
	[3] = { coords = vector3(423.07, -974.36, 30.71), action = 'clean', actiontime = 10 },
	[4] = { coords = vector3(422.97, -978.89, 30.71), action = 'clean', actiontime = 15 },
	[5] = { coords = vector3(422.85, -983.29, 30.71), action = 'clean', actiontime = 15 },
	[6] = { coords = vector3(418.15, -988.54, 29.37), action = 'repair', actiontime = 15 },
	[7] = { coords = vector3(424.22, -995.87, 30.71), action = 'repair', actiontime = 15 },
	[8] = { coords = vector3(435.86, -976.8, 30.72), action = 'repair', actiontime = 15 },
}

Config.SpeedFines = {
	{ speed = 80, fine = 100 },
	{ speed = 100, fine = 200 },
	{ speed = 120, fine = 300 },
	{ speed = 140, fine = 400 },
	{ speed = 160, fine = 500 },
	{ speed = 180, fine = 600 },
	{ speed = 200, fine = 700 },
	{ speed = 220, fine = 800 },
	{ speed = 240, fine = 900 },
	{ speed = 260, fine = 1000 },
}

-- The vehicles, helicopters and boats locations only work if Config.UseOkokGarage is false
Config.Locations = {
	vehicles = {
		[1] = {
			coords = vector4(458.78, -1017.26, 28.18, 271.5),
			storecoords = vector4(463.04, -1019.64, 27.7, 271.0),
			vehicles = {
				{ 
					model = 'police', 
					label = 'Police Cruiser',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police2', 
					label = 'Police Interceptor',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police3', 
					label = 'Police Interceptor (2)',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police4', 
					label = 'Police Buffalo',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
			},
			vehiclesSpawn = {
				vector4(446.06, -1025.76, 28.25, 3.14),
				vector4(442.54, -1025.98, 28.31, 2.84),
				vector4(438.59, -1026.44, 28.39, 5.22)
			}
		},
		[2] = {
			coords = vector4(-446.49, 6041.74, 31.34, 44.06),
			storecoords = vector4(-445.58, 6048.27, 31.34, 36.47),
			vehicles = {
				{ 
					model = 'police', 
					label = 'Police Cruiser',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police2', 
					label = 'Police Interceptor',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police3', 
					label = 'Police Interceptor (2)',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
				{ 
					model = 'police4', 
					label = 'Police Buffalo',
					plate = 'POLICE',
					minimumGrade = 1,
					livery = 4,
					armor = 4,
					brakes = 2,
					engine = 3,
					suspension = 3,
					transmission = 2,
					turbo = true,
					windowstint = 2,
					--vehicleColor = { 0, 0, 0 }
				},
			},
			vehiclesSpawn = {
				vector4(-452.59, 6049.98, 30.95, 219.0),
				vector4(-448.95, 6052.67, 30.95, 211.13),
				vector4(-444.72, 6054.05, 30.95, 208.19)
			}
		},
	},
	helicopters = {
		[1] = {
			coords = vector4(459.47, -981.37, 43.69, 93.83),
			storecoords = vector4(449.29, -981.21, 44.08, 94.65),
			vehicles = {
				{ model = 'polmav', label = 'Police Maverick', minimumGrade = 1, livery = 0 },
			},
			vehiclesSpawn = {
				vector4(449.29, -981.21, 44.08, 94.65),
			}
		},
		[2] = {
			coords = vector4(-467.73, 5997.28, 31.26, 133.68),
			storecoords = vector4(-474.97, 5988.99, 31.34, 141.29),
			vehicles = {
				{ model = 'polmav', label = 'Police Maverick', minimumGrade = 1, livery = 0 },
			},
			vehiclesSpawn = {
				vector4(-474.97, 5988.99, 31.34, 141.29)
			}
		},
	},
	boats = {
		[1] = {
			coords = vector4(-786.92, -1489.66, 1.6, 108.87),
			storecoords = vector4(-792.37, -1495.28, 0.59, 291.07),
			vehicles = {
				{ model = 'predator', label = 'Police Predator', minimumGrade = 1 },
			},
			vehiclesSpawn = {
				vector4(-794.18, -1486.44, 0.59, 112.32),
			}
		},
	},
	armories = {
		[1] = {
			coords = vector3(459.19, -979.0, 30.69),
			weapons = {
				{ name = 'weapon_pistol', price = 500, amount = 50, minimumGrade = 0 },
				{ name = 'weapon_stungun', price = 800, amount = 30, minimumGrade = 0 },
				{ name = 'weapon_smg', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'weapon_carbinerifle', price = 3500, amount = 15, minimumGrade = 2 },
				{ name = 'pistol_ammo', price = 50, amount = 200, minimumGrade = 0 },
				{ name = 'smg_ammo', price = 100, amount = 150, minimumGrade = 1 },
				{ name = 'rifle_ammo', price = 200, amount = 100, minimumGrade = 2 },
				{ name = 'weapon_flashlight', price = 100, amount = 100, minimumGrade = 0 },
				{ name = 'weapon_nightstick', price = 200, amount = 100, minimumGrade = 0 },
				{ name = 'radio', price = 1000, amount = 25, minimumGrade = 0 },
				{ name = 'heavyarmor', price = 1500, amount = 10, minimumGrade = 1 },
				{ name = 'handcuffs', price = 300, amount = 100, minimumGrade = 0 },
			}
		},
		[2] = {
			coords = vector3(-444.23, 6011.28, 31.72),
			weapons = {
				{ name = 'weapon_pistol', price = 500, amount = 50, minimumGrade = 0 },
				{ name = 'weapon_stungun', price = 800, amount = 30, minimumGrade = 0 },
				{ name = 'weapon_smg', price = 2500, amount = 20, minimumGrade = 1 },
				{ name = 'weapon_carbinerifle', price = 3500, amount = 15, minimumGrade = 2 },
				{ name = 'pistol_ammo', price = 50, amount = 200, minimumGrade = 0 },
				{ name = 'smg_ammo', price = 100, amount = 150, minimumGrade = 1 },
				{ name = 'rifle_ammo', price = 200, amount = 100, minimumGrade = 2 },
				{ name = 'weapon_flashlight', price = 100, amount = 100, minimumGrade = 0 },
				{ name = 'weapon_nightstick', price = 200, amount = 100, minimumGrade = 0 },
				{ name = 'radio', price = 1000, amount = 25, minimumGrade = 0 },
				{ name = 'heavyarmor', price = 1500, amount = 10, minimumGrade = 1 },
				{ name = 'handcuffs', price = 300, amount = 100, minimumGrade = 0 },
			}
		}
	},
	cloakrooms = {
		[1] = { coords = vector3(454.38, -993.28, 30.69) },
		[2] = { coords = vector3(-450.06, 6016.18, 31.72) }
	},
	stashes = {
		[1] = { coords = vector3(459.01, -982.92, 30.69) },
		[2] = { coords = vector3(-441.97, 6012.77, 31.72) }
	},
	trashes = {
		[1] = { coords = vector3(439.82, -976.8, 30.69) },
		[2] = { coords = vector3(-451.18, 6011.74, 31.72) }
	},
	evidences = {
		[1] = { coords = vector3(455.27, -985.49, 30.69) },
		[2] = { coords = vector3(-446.4, 6008.88, 31.72) }
	},
	sendreports = {
		[1] = { coords = vector3(441.04, -981.15, 30.69) },
		[2] = { coords = vector3(-447.57, 6013.69, 31.72) }
	},
	openreports = {
		[1] = { coords = vector3(441.13, -978.85, 30.69) },
		[2] = { coords = vector3(-448.08, 6011.99, 31.72) }
	},
	blips = {
		{ name = 'Los Santos Station', color = 38, sprite = 137, scale = 0.8, coords = vector3(447.83, -985.41, 30.69) },
		{ name = 'Paleto Station', color = 38, sprite = 137, scale = 0.8, coords = vector3(-446.27, 6013.56, 31.72) },
		{ name = 'Prison', color = 38, sprite = 188, scale = 1.1, coords = vector3(1858.33, 2606.69, 45.67) },
	}
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.SearchPlayerWebhook = true
Config.SearchPlayerWebhookColor = '65280'

Config.JailPlayerWebhook = true
Config.JailPlayerWebhookColor = '65280'

Config.CommunityPlayerWebhook = true
Config.CommunityPlayerWebhookColor = '65280'

Config.AddAnkleWebhook = true
Config.AddAnkleWebhookColor = '65280'

Config.RemoveAnkleWebhook = true
Config.RemoveAnkleWebhookColor = '16711680'

Config.ReportsWebhook = true
Config.ReportsWebhookColor = '65280'

Config.ChangeReportWebhook = true
Config.ChangeReportWebhookColor = '65280'

Config.DeleteReportWebhook = true
Config.DeleteReportWebhookColor = '16711680'

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}
{% endtabs %}


# qb-inventory support

MOST RECENT VERSION ONLY

Navigate to **server/main.lua** and after `print(#result .. ' inventories successfully loaded')`, add the following code:

```lua
canClear = true
```

Then, go to server/functions.lua, and paste following code after `exports('ClearInventory', ClearInventory)`:

```lua
local canClear = false

function ClearInventoryByName(inventory)
    local stopThread = false
    CreateThread(function()
        while not canClear and not stopThread do
            Wait(100)
            local player = QBCore.Functions.GetPlayer(source)
            for k,v in pairs(Inventories) do
                if k == inventory then
                    print('Inventory found, clearing...')
                    print('Inventory: ' .. k)
                    Inventories[k] = nil
                    stopThread = true
                    break
                end
            end
        end
    end)
end

exports('ClearInventoryByName', ClearInventoryByName)
```


# okokBossMenu

[**YouTube Video**](https://www.youtube.com/watch?v=u-jhOJ9PZv0)

## Installation Guide

### Requirements:

ox\_lib **v3.16.2+** (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>).

### Execute the following SQL code in your database:

```sql
CREATE TABLE IF NOT EXISTS `okokbossmenu_hours` (
  `id` int NOT NULL AUTO_INCREMENT,
  `citizenid` varchar(255) NOT NULL,
  `hours` text NOT NULL,
  `last_login` text DEFAULT NULL,
  `job` text DEFAULT NULL,
  PRIMARY KEY (`id`)
)
```

### ESX ONLY

Execute the following SQL code in your database:

```sql
ALTER TABLE `users` ADD COLUMN `isOnDuty` BOOLEAN NOT NULL DEFAULT FALSE;
```

Add the following code at the end of **es\_extended/server/main.lua**:

```lua
RegisterNetEvent("okokBossMenu:savePlayers")
AddEventHandler("okokBossMenu:savePlayers", function()
    Core.SavePlayers()
end)
```

### Server artifacts

Make sure your server artifacts version is up to date.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt (not yet) / es (not yet) / fr (not yet) / de (not yet)

Config.Debug = false -- true = Debug mode, it will show the debug messages on the console

Config.AutoAddDatabaseTables = true -- true = Auto add the database tables | false = You need to add the database tables manually

Config.AutoCreateSociety = true -- true = Auto create the society on the database tables | false = You need to create the society manually

Config.UseOkokNotify = true -- true = okokNotify | false = esx-notify (You can change the notification system on cl_utils.lua)

Config.UseOkokTextUI = true -- true = okokTextUI | false = esx-textui

Config.UseOkokRequests = true -- true = okokRequests | false right away

Config.UseJobBlip = true -- true = marker or target | false = open with a command

Config.UseTarget = false -- true = Target | false = textUI

Config.EventPrefix = "okokBossMenu"  -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.SocietySystem = "addon-account" -- addon-account / okokbanking

Config.TargetSystem = "ox-target" -- The target system you are using ( ox-target )

Config.InventorySystem = "ox-inventory" -- The inventory system you are using ( ox-inventory )

Config.ClothingSystem = "illenium-appearance" -- The clothing system you are using ( esx_skin / illenium-appearance )

Config.OpenBossMenuCommand = "openbossmenu" -- The command to open the boss menu if Config.UseJobBlip = false

Config.OpenGangMenuCommand = "opengangmenu" -- The command to open the gang menu if Config.UseJobBlip = false

Config.OpenDutyCommand = "openduty" -- The command to open the duty menu if Config.UseJobBlip = false

Config.BossGrade = "boss" -- The grade that the boss has

Config.Currency = "€" -- The currency used on the script

Config.DefaultPaymentAfterFire = 50 -- The default payment after being fired

Config.HireDistance = 3.0 -- The distance that the player needs to be to hire someone

Config.MarkerID = 21 -- The marker ID for the job locations

Config.TimeLocale = 'pt-PT' -- https://www.localeplanet.com/icu/

Config.MarkerColors = { r = 31, g = 94, b = 255, a = 90 } -- The marker colors for the job locations

Config.JobLocations = {
    ['police'] = 	{ bossCoords = vector3(447.69, -973.46, 30.69), dutyCoords = vector3(440.21, -975.72, 30.69) },
	['ambulance'] = { bossCoords = vector3(305.68, -597.83, 43.29), dutyCoords = vector3(295.68, -601.83, 43.29) },
	['ballas'] = { bossCoords = vector3(114.18, -1960.81, 21.33), dutyCoords = vector3(109.48, -1961.42, 20.96) },
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'

Config.OnDutyWebhook = true
Config.OnDutyWebhookColor = '65280'

Config.OffDutyWebhook = true
Config.OffDutyWebhookColor = '16711680'

Config.GivenBonusWebhook = true
Config.GivenBonusWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt (not yet) / es (not yet) / fr (not yet) / de (not yet)

Config.Debug = false -- true = Debug mode, it will show the debug messages on the console

Config.AutoAddDatabaseTables = true -- true = Auto add the database tables | false = You need to add the database tables manually

Config.AutoCreateSociety = true -- true = Auto create the society on the database tables | false = You need to create the society manually

Config.UseOkokNotify = true -- true = okokNotify | false = qb-notify (You can change the notification system on cl_utils.lua)

Config.UseOkokTextUI = true -- true = okokTextUI | false = qb-drawtext

Config.UseOkokRequests = true -- true = okokRequests | false right away

Config.UseJobBlip = true -- true = marker or target | false = open with a command

Config.UseTarget = false -- true = Target | false = textUI

Config.EventPrefix = "okokBossMenu"  -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.SocietySystem = "qb-banking" -- qb-banking / qb-management / okokbanking

Config.TargetSystem = "qb-target" -- The target system you are using (qb-target / ox-target)

Config.InventorySystem = "qb-inventory" -- The inventory system you are using ( qb-inventory / ox-inventory )

Config.ClothingSystem = "qb-clothing" -- The clothing system you are using ( qb-clothing / illenium-appearance )

Config.OpenBossMenuCommand = "openbossmenu" -- The command to open the boss menu if Config.UseJobBlip = false

Config.OpenGangMenuCommand = "opengangmenu" -- The command to open the gang menu if Config.UseJobBlip = false

Config.OpenDutyCommand = "openduty" -- The command to open the duty menu if Config.UseJobBlip = false

Config.Currency = "€" -- The currency used on the script

Config.DefaultPaymentAfterFire = 50 -- The default payment after being fired

Config.HireDistance = 3.0 -- The distance that the player needs to be to hire someone

Config.MarkerID = 21 -- The marker ID for the job locations

Config.TimeLocale = 'pt-PT' -- https://www.localeplanet.com/icu/

Config.MarkerColors = { r = 31, g = 94, b = 255, a = 90 } -- The marker colors for the job locations

Config.JobLocations = {
    ['police'] = 	{ bossCoords = vector3(447.69, -973.46, 30.69), dutyCoords = vector3(440.21, -975.72, 30.69) },
	['ambulance'] = { bossCoords = vector3(305.68, -597.83, 43.29), dutyCoords = vector3(295.68, -601.83, 43.29) },
	['ballas'] = { bossCoords = vector3(114.18, -1960.81, 21.33), dutyCoords = vector3(109.48, -1961.42, 20.96) },
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'

Config.OnDutyWebhook = true
Config.OnDutyWebhookColor = '65280'

Config.OffDutyWebhook = true
Config.OffDutyWebhookColor = '16711680'

Config.GivenBonusWebhook = true
Config.GivenBonusWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}
{% endtabs %}


# okokMulticharacter

[**YouTube Video**](https://www.youtube.com/watch?v=y3jeEuLz6bs)

## Installation Guide

### Requirements:

* ox\_lib **v3.16.2+** (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>);
* Disable qb-multicharacter/esx\_multicharacter.

### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokmulticharacter_tebexids`(
    `identifier` varchar(255) NOT NULL PRIMARY KEY,
    `tebexids` longtext NULL
);
```

### Enable Purchased Character Slots (via Tebex)

Go to your **server.cfg** and add `setr sv_tebexSecret YOURSECRETKEY`.

{% hint style="info" %}
To obtain the **Secret Key**, go to <https://creator.tebex.io/game-servers> and hit the **Edit** button.&#x20;
{% endhint %}

Now, you should set the package id in the config file (**Config.PackageID**).

{% hint style="info" %}
Once you've created the package on Tebex, you'll find a link similiar to this one: <https://creator.tebex.io/packages/1726354>; simply copy the final numbers and paste them after the **Config.PackageID**.
{% endhint %}

### ESX ONLY

Navigate to **es\_extended/config.lua** and set **`Config.Multichar = true`** instead of `Config.Multichar = GetResourceState("esx_multicharacter") ~= "missing"`.

### Server artifacts

Make sure your server artifacts version is up to date.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt (not yet) / es (not yet) / fr (not yet) / de (not yet)

Config.Debug = false -- true = debug | false = no debug

Config.UseOkokNotify = true -- true = okokNotify | false = qb-notify ( You can change the notification system on cl_utils.lua )

Config.EventPrefix = "okokMulticharacter" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.ClothingSystem = "qb-clothing" -- qb-clothing / codem-appearance / illenium-appearance / fivem-appearance / other (changeable in cl_utils.lua)

Config.UseOkokSpawnSelector = true -- true = okokSpawnSelector | false = qb-spawnselector ( You can change the spawn selector on cl_utils.lua )

Config.MaxNormalCharacters = 3 -- Max characters per license

Config.MaxVipCharacters = 3 -- Max characters per license

Config.Currency = '€' -- The currency used on the script

Config.CurrencyonLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.SkipSpawnSelection = false -- true = skip spawn selection | false = don't skip spawn selection

Config.StartSpawnCoords = vector4(915.73, 54.46, 111.66, 14.83) -- Spawn coords for the first spawn without the spawn selector

Config.PedCoords = vector4(915.73, 54.46, 111.66, 14.83) -- Spawn ped coords

Config.UseTebex = true -- true = use the tebex to purchase licenses | false = use the Config.ExclusiveLicenses

Config.PackageID = 5533104 -- Open the package on tebex and get the ID from the URL

Config.ExclusiveLicenses = { -- If you want to add licenses with custom amount of characters (only if you are not using Config.UseTebex)
	{ license = 'license:2139218309123712308120', characters = 6 }
}

Config.BlacklistedWords = { -- Words that are not allowed on the character name
	-- Add the words you want to blacklist here
}

Config.StartItems = { -- If you want to add metadata you can go to sv_utils.lua and change the initialItemsInfo function
	{ name = 'driver_license', amount = 1 },
	{ name = 'id_card', 	   amount = 1 },
	{ name = 'phone', 		   amount = 1 },
}

Config.AnimationList = {
	 { animation = "amb@world_human_stand_guard@male@enter", name = "enter" },
	 { animation = "anim@mp_player_intcelebrationmale@salute", name = "salute" },
	 { animation = "amb@world_human_muscle_flex@arms_in_front@idle_a", name = "idle_a"  }
}

Config.Scenarios = {
	lossantoscasino = {
	   cameracoords = vector4(914.25, 57.66, 112.16, 188.17), 
	   hiddencoords = vector3(936.41, 59.1, 111.2),
	   peddeletecoords = vector3(907.75, 53.38, 111.7),
	   pedpositions = {
		   { coords = vector4(913.38, 53.09, 111.66, 343.88)},
		   { coords = vector4(914.7, 54.73, 111.66, 353.73)},
		   { coords = vector4(916.58, 53.66, 111.7, 26.73)},
	   },
   },
   office = {
	   cameracoords = vector4(384.78, -68.04, 104.20, 348.96), 
	   hiddencoords = vector3(380.03, -58.85, 103.36),
	   peddeletecoords = vector3(388.68, -68.59, 103.36),
	   pedpositions = {
		   { coords = vector4(386.91, -64.91, 103.36, 117.41)},
		   { coords = vector4(385.56, -63.4, 103.36, 169.82)},
		   { coords = vector4(383.87, -64.17, 103.36, 212.26)},
	   },
   },
	luxuryapp = {
	   cameracoords = vector4(-789.34, 328.95, 218.15, 270.12), 
	   hiddencoords = vector3(-793.39, 324.56, 217.04),
	   peddeletecoords = vector3(-788.46, 320.92, 217.04),
	   pedpositions = {
		   { coords = vector4(-783.65, 326.75, 217.04, 359.85)},
		   { coords = vector4(-785.0, 329.04, 217.04, 92.57)},
		   { coords = vector4(-783.74, 331.33, 217.04, 186.45)},
	   },
   },
   yatch = {
	   cameracoords = vector4(-1400.09, 6746.28, 9.97, 245.06), 
	   hiddencoords = vector3(-1471.03, 6769.2, 8.57),
	   peddeletecoords = vector3(-1430.62, 6759.26, 8.97),
	   pedpositions = {
		   { coords = vector4(-1394.86, 6743.79, 8.97, 59.23)},
		   { coords = vector4(-1396.76, 6742.9, 8.97, 47.55)},
		   { coords = vector4(-1395.23, 6745.96, 8.97, 296.91)},
	   },
   }, 
   casinopenthouse = {
	   cameracoords = vector4(972.27, 74.09, 116.90, 94.16), 
	   hiddencoords = vector3(979.11, 78.46, 116.16),
	   peddeletecoords = vector3(972.36, 74.65, 116.16),
	   pedpositions = {
		   { coords = vector4(965.94, 73.02, 116.18, 241.94)},
		   { coords = vector4(967.46, 71.27, 116.18, 338.38)},
		   { coords = vector4(967.8, 75.27, 116.18, 233.3)},
	   },
   },
}

-------------------------- LOCALES (DON'T TOUCH)

function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```


# okokPhone

[**Notion Documentation**](https://okokphone.notion.site)

[**YouTube Video**](https://www.youtube.com/watch?v=Q7t1E57nCYo)


# okokSpawnSelector

[**YouTube Video**](https://www.youtube.com/watch?v=TFCxQDH0F9Q)

## Installation Guide

### Requirements

ox\_lib **v3.16.2+** (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>).

### Event to open the menu

{% tabs %}
{% tab title="Client" %}

```lua
TriggerEvent('okokSpawnSelector:spawnMenu', newCharacter, lastCoords)
```

{% endtab %}

{% tab title="Server" %}

```lua
TriggerClientEvent('okokSpawnSelector:spawnMenu', source, newCharacter, lastCoords)
```

{% endtab %}
{% endtabs %}

**newCharacter** should be true or false.

**lastCoords** is optional and it's used to pass the last location of the player (format example: `{"x":936.40,"y":59.09,"z":111.03}`).

### vSync compatibility

Add the following line at the end of the **vSync/vs\_server.lua** file:

```lua
exports('getWeatherState', function() return CurrentWeather end)
```

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de

Config.Debug = false -- true = debug | false = no debug

Config.EventPrefix = "okokSpawnSelector" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.MulticharacterSystem = "esx_multicharacter" -- esx_multicharacter / other (changeable in cl_utils.lua)

Config.HouseSystem = "none" -- none / qs-housing / other (changeable in sv_utils.lua)

Config.ClothingSystem = "esx_skin" -- esx_skin / other (changeable in cl_utils.lua)

Config.WeatherSystem = "vSync" -- vSync / other (changeable in sv_utils.lua)

Config.TimeLocale = 'en-US' -- https://www.localeplanet.com/icu/

Config.Use24HourClock = false -- true = 24 hour clock | false = 12 hour clock

Config.UseCelsius = true -- true = celsius | false = fahrenheit

Config.UseOnPlayerLoaded = true -- true = open menu on player loaded | false = use the event to open the menu

Config.Spawns = {
    {label = "Los Santos Golf Club", location = "lsgolfclub",   coords = vector4(-1368.97, 56.78, 53.7, 99.89),      job = "all"},
    {label = "Sandy Shores Airport", location = "ssairport",    coords = vector4(1720.2, 3271.57, 41.15, 123.96),    job = "all"},
    {label = "Los Santos Airport",   location = "lsairport",    coords = vector4(-1733.49, -2907.92, 13.94, 123.96), job = "all"},
    {label = "Police Department",    location = "police",       coords = vector4(428.23, -984.28, 29.76, 3.5),       job = "police"},
    {label = "Pillbox Hospital",     location = "hospital",     coords = vector4(280.39, -587.89, 43.3, 69.38),      job = "ambulance"},
    {label = "Los Santos Pier",      location = "lspier",       coords = vector4(-1610.78, -1055.84, 13.04, 320.02), job = "all"},
    {label = "Legion Square",        location = "legionsquare", coords = vector4(195.17, -933.77, 29.7, 144.5),      job = "all"},
    {label = "Sandy Shores",         location = "sandyshores",  coords = vector4(1815.52, 3793.48, 33.65, 212.04),   job = "all"},
    {label = "Paleto Bay",           location = "paleto",       coords = vector4(-210.57, 6336.5, 31.37, 232.45),    job = "all"},
    {label = "Military Base",        location = "militar",      coords = vector4(-1945.94, 3031.16, 32.81, 152.08),  job = "all"},
    {label = "Observatory",          location = "observatory",  coords = vector4(-425.6, 1123.74, 325.85, 343.9),    job = "all"},
    {label = "Bennys",               location = "bennys",       coords = vector4(-205.83, -1305.17, 31.37, 181.28),  job = "mechanic"},
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.PlayerSpawnedWebhook = true
Config.PlayerSpawnedWebhookColor = '65280'

Config.PlayerCreatedWebhook = true
Config.PlayerCreatedWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de

Config.Debug = false -- true = debug | false = no debug

Config.EventPrefix = "okokSpawnSelector" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.MulticharacterSystem = "qb-multicharacter" -- qb-multicharacter / other (changeable in cl_utils.lua)

Config.HouseSystem = "qb-houses" -- none / qb-houses / qs-housing / other (changeable in sv_utils.lua)

Config.ClothingSystem = "qb-clothing" -- qb-clothing / other (changeable in cl_utils.lua)

Config.WeatherSystem = "qb-weathersync" -- qb-weathersync / other (changeable in sv_utils.lua)

Config.TimeLocale = 'en-US' -- https://www.localeplanet.com/icu/

Config.Use24HourClock = false -- true = 24 hour clock | false = 12 hour clock

Config.UseCelsius = true -- true = celsius | false = fahrenheit

Config.UseQBApartments = true -- true = qb-apartments | false = no qb-apartments (if you don't use qb-apartments, you need to remove line 17 on fxmanifest.lua)

Config.UseOnPlayerLoaded = false -- true = open menu on player loaded | false = use the event to open the menu

Config.Spawns = {
    {label = "Los Santos Golf Club", location = "lsgolfclub",   coords = vector4(-1368.97, 56.78, 53.7, 99.89),      job = "all"},
    {label = "Sandy Shores Airport", location = "ssairport",    coords = vector4(1720.2, 3271.57, 41.15, 123.96),    job = "all"},
    {label = "Los Santos Airport",   location = "lsairport",    coords = vector4(-1733.49, -2907.92, 13.94, 123.96), job = "all"},
    {label = "Police Department",    location = "police",       coords = vector4(428.23, -984.28, 29.76, 3.5),       job = "police"},
    {label = "Pillbox Hospital",     location = "hospital",     coords = vector4(280.39, -587.89, 43.3, 69.38),      job = "ambulance"},
    {label = "Los Santos Pier",      location = "lspier",       coords = vector4(-1610.78, -1055.84, 13.04, 320.02), job = "all"},
    {label = "Legion Square",        location = "legionsquare", coords = vector4(195.17, -933.77, 29.7, 144.5),      job = "all"},
    {label = "Sandy Shores",         location = "sandyshores",  coords = vector4(1815.52, 3793.48, 33.65, 212.04),   job = "all"},
    {label = "Paleto Bay",           location = "paleto",       coords = vector4(-210.57, 6336.5, 31.37, 232.45),    job = "all"},
    {label = "Military Base",        location = "militar",      coords = vector4(-1945.94, 3031.16, 32.81, 152.08),  job = "all"},
    {label = "Observatory",          location = "observatory",  coords = vector4(-425.6, 1123.74, 325.85, 343.9),    job = "all"},
    {label = "Bennys",               location = "bennys",       coords = vector4(-205.83, -1305.17, 31.37, 181.28),  job = "mechanic"},
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.PlayerSpawnedWebhook = true
Config.PlayerSpawnedWebhookColor = '65280'

Config.PlayerCreatedWebhook = true
Config.PlayerCreatedWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}
{% endtabs %}


# qb-multicharacter support

1. Navigate to **qb-multicharacter/client/main.lua** (around the line **100**) and add the following code after `SetNuiFocus(false, false)`:

```lua
skyCam(false)
```

2. Then, on **qb-multicharacter/server/main.lua**, search for `RegisterNetEvent('qb-multicharacter:server:loadUserData', function(cData)` and replace:

```lua
if GetResourceState('qb-apartments') == 'started' then
    TriggerClientEvent('apartments:client:setupSpawnUI', src, cData)
else
```

With:

<pre class="language-lua"><code class="lang-lua">if GetResourceState('okokSpawnSelector') == 'started' then
<strong>    local coords = json.decode(cData.position)
</strong><strong>    TriggerClientEvent('okokSpawnSelector:spawnMenu', src, false, coords)
</strong>else
</code></pre>

3. Now, in the same file, search for `RegisterNetEvent('qb-multicharacter:server:createCharacter', function(data)` and replace:

```lua
TriggerClientEvent('apartments:client:setupSpawnUI', src, newData)
```

With:

```lua
TriggerClientEvent('okokSpawnSelector:spawnMenu', src, true)
```


# okokLoadingScreen

[**YouTube Video**](https://www.youtube.com/watch?v=BUxa9Uuhus8)

## Installation Guide

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```javascript
Config = {};

Config.Locale = 'en'; // en / pt / es / fr / de

Config.MusicVolume = 0.15 // 0.0 - 1.0

Config.BackgroundVideo = true // true it will use a video (img/video/.WEBM), false it will use a carousel of images (img/slide/.JPG)

Config.UpdateCarouselTime = 8; // Time in seconds

Config.Color = '#1f5eff' // Color of the UI

Config.SocialMedia = {
    instagram: {
        link: "https://discord.gg/okok", // Change this to your social media link
    },
    tiktok: {
        link: "https://discord.gg/okok",
    },
    youtube: {
        link: "https://www.youtube.com/@okokscripts",
    },
    discord: {
        link: "https://discord.gg/okok",
    },
};

Config.StaffMembers = {
    1: {
        name: "Jackson Brown", // Staff member name
        rank: "administrator", // Staff member rank (administrator / moderator and can't be changed)
        image: "", // Staff member image (img/avatars/image_name.jpg)
    },
    2: {
        name: "Liam Smith",
        rank: "administrator",
        image: "",
    },
    3: {
        name: "Logan Parker",
        rank: "administrator",
        image: "",
    },
    4: {
        name: "Jacob Turner",
        rank: "administrator",
        image: "",
    },
    5: {
        name: "Samuel Brooks",
        rank: "moderator",
        image: "",
    },
    6: {
        name: "Lucas Foster",
        rank: "moderator",
        image: "",
    },
    7: {
        name: "Natalie Bennett",
        rank: "moderator",
        image: "",
    },
}

Config.UpdateList = {
    1: {
        date: 'November 25, 2023',
        title: 'Update Patch Notes 1.1',
        subtitle: 'Our new update is finally here!',
        description: 'We are thrilled to announce our latest update after 7 months of development! This update includes new maps, new cars, and more!',
        image: 'patchnotes.jpg',
        updateList: {
            1: {
                description: 'New Maps: Explore the vast landscapes of our new map, filled with hidden treasures and dangers.',
            },
            2: {
                description: 'New Cars: Experience the thrill of driving our newly added cars, each with unique designs and features.',
            },
            3: {
                description: 'And More: We have also made several improvements and bug fixes to enhance your gaming experience.',
            },
        }
    },
    2: {
        date: 'December 21, 2023',
        title: 'Grand Racing Tournament',
        subtitle: 'Rev up your engines for the ultimate race!',
        description: 'Get ready for the thrill of the Grand Racing Tournament! Compete against the best racers, unlock new tracks, and claim the title of the fastest driver!',
        image: 'racing.jpg',
        updateList: {
            1: {
                description: 'Challenging Tracks: Experience adrenaline-pumping races on brand new and challenging racetracks.',
            },
            2: {
                description: 'High-Speed Vehicles: Unlock and race with high-performance vehicles, each with its unique characteristics.',
            },
            3: {
                description: 'Tournament Rewards: Compete for exclusive rewards and claim your place as the champion of the Grand Racing Tournament!',
            },
        }
    },
    3: {
        date: 'December 25, 2023',
        title: 'Christmas Sale Event',
        subtitle: 'The Christmas event is now available!',
        description: 'Celebrate the holiday season with our Christmas Sale Event! Enjoy special discounts, festive activities, and more!',
        image: 'christmas.jpg',
        updateList: {
            1: {
                description: 'Special Discounts: Explore the Christmas sale using the code \'\' for 50% discount on okok.tebex.io - limited to the first 10 uses.',
            },
            2: {
                description: 'Festive Activities: Engage in holiday-themed activities scattered throughout the new island.',
            },
            3: {
                description: 'Limited-Time Rewards: Earn exclusive rewards by participating in the Christmas event. Don\'t miss out!',
            },
        }
    },
}

Config.Music = {
    1: {
        filename: 'goneforgood.mp3',
        title: 'Gone For Good',
        artist: 'Rival x Jim Yosef'
    },
    2: {
        filename: 'allineed.mp3',
        title: 'All I Need',
        artist: 'Ariadne'
    },
    3: {
        filename: 'holdonme.mp3',
        title: 'Hold On Me',
        artist: 'Raul Ojamaa'
    }
};
```


# okokVehicleSales

[**YouTube Video**](https://www.youtube.com/watch?v=egPjS-pkaII)

## **Installation Guide**

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokvehiclesales_stores`(
    `store_name` varchar(255) NOT NULL,
    `store_id` varchar(255) NOT NULL PRIMARY KEY,
    `owner` varchar(255) NULL DEFAULT NULL,
    `owner_name` varchar(255) NULL DEFAULT NULL,
    `owner_phone` varchar(255) NULL DEFAULT NULL,
    `money` varchar(255) NOT NULL,
    `business_price` varchar(255) NOT NULL,
    `vehicles_sold_owner` varchar(255) DEFAULT 0,
    `total_earned_owner` varchar(255) DEFAULT 0,
    `vehicles` longtext NULL,
    `employees` longtext NULL,
    `inactivity_date` varchar(255) DEFAULT NULL
);

CREATE TABLE `okokvehiclesales_orders`(
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `store_id` varchar(255) NOT NULL,
    `vehicle` varchar(255) NOT NULL,
    `price` varchar(255) NOT NULL,
    `status` varchar(255) NOT NULL,
    `employee_name` varchar(255) NOT NULL,
    `employee_id` varchar(255) NOT NULL,
    `customer_name` varchar(255) NOT NULL,
    `customer_phone` varchar(255) NOT NULL,
    `notes` varchar(255) NOT NULL,
    `date` varchar(255) NOT NULL
);

CREATE TABLE `okokvehiclesales_saleshistory`(
    `store_id` varchar(255) NOT NULL,
    `seller_id` varchar(255) NOT NULL,
    `seller_name` varchar(255) NOT NULL,
    `vehicle_name` varchar(255) NOT NULL,
    `plate` varchar(255) NOT NULL,
    `value` varchar(255) NOT NULL,
    `date` varchar(255) NOT NULL
);

CREATE TABLE `okokvehiclesales_auctions`(
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `store_id` varchar(255) NOT NULL,
    `vehicle` varchar(255) NOT NULL,
    `plate` varchar(255) NOT NULL,
    `starting_bid` varchar(255) NOT NULL DEFAULT 0,
    `total_bids` varchar(255) NOT NULL DEFAULT 0,
    `higher_bid` varchar(255) NOT NULL DEFAULT 0,
    `higher_bidder_id` varchar(255) DEFAULT NULL,
    `higher_bidder_name` varchar(255) DEFAULT NULL,
    `higher_bidder_phone` varchar(255) DEFAULT NULL,
    `bidders` longtext NULL
);
```

If using **ESX**, execute the following code as well:

```sql
ALTER TABLE owned_vehicles ADD okokVehicleSalesOwned varchar(255) NOT NULL DEFAULT 0;
```

If using **QBCore**, execute the following code:

```sql
ALTER TABLE player_vehicles ADD okokVehicleSalesOwned varchar(255) NOT NULL DEFAULT 0;
```

### Set the Discord Webhook URL (to enable logs)

Navigate to the `sv_utils.lua` file and paste the webhook URL in the line 2.

[How to create a Discord Webhook URL](https://ahsda89sgdh18923asd.gitbook.io/main/others/discord-webhook)

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de

Config.DevMode = true -- true = Can restart the script in game that everything works | false = You can't restart the script in game otherwise it stops working

Config.Debug = false -- true = Debug mode, it will show the debug messages on the console

Config.DebugZones = false -- true = Debug mode, it will show the zones created

Config.ZoneHeight = 4 -- Height of the zones

Config.ZoneSize = vec3(3, 6, 2) -- Size of the zones

Config.UseOkokNotify = true -- true = okokNotify | false = esx-notify (You can change the notification system on cl_utils.lua)

Config.UseOkokTextUI = true -- true = okokTextUI | false = esx-textUI

Config.UseOkokRequests = true -- true = okokRequests | false = Hire right away

Config.UseOkokBanking = true -- true = The transactions will be registered on okokBanking

Config.UseOkokChat = true -- true = When a auction starts the notification will be sent by okokChat, otherwise it will send a notification

Config.UseOkokContract = true -- true = The vehicle purchase / sell will be handled by okokContract

Config.RequireItem = false -- true = The player will need to have the item in order to open the contract

Config.ItemName = 'contract' -- Name of the item that will be required to open the contract

Config.BuyVehicleOutright = false -- true = The player will be able to purchase the vehicle outright | false = The player will have to contact one of the business employees in order to purchase it

Config.UseSameImageForVehicles = true -- true = The vehicle image will be the same

Config.PrioritizeCash = false -- If true, it will prioritize cash over bank money when you buy a vehicle

Config.Currency = '€' -- The currency used on the script

Config.CurrencyonLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.EventPrefix = "okokVehicleSales" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.StateColumn = "stored" -- The column name of the state on the database

Config.MaxDealershipsPerPlayer = 5 -- How many dealership a player can own

Config.MaxEmployeesPerDealership = 10 -- How many employees a dealership can have

Config.HireDistance = 3 -- How close a player needs to be to be in the hiring range

Config.VehicleDistance = 10 -- How close a vehicle need to be to be in the vehicle range

Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

Config.ShowOwnerBlip = true -- Activate/Deactivate owner blips

Config.ShowBuyShopBlip = true -- Activate/Deactivate buy store blip

Config.UseRoadNamesToShop = true -- true = The shop will be named after the road name

Config.SubOwnerRank = 4 -- ID of the rank that will work as a secondary owner ( check the Config.Ranks )

Config.SalesHistoryLimit = 25 -- Records for each shop that will be saved on the sale history table

Config.SalesDateFormat = "%d/%m - %H:%M" -- The Date that will be shown on Sales History

Config.GarageSystem = "none" -- none / cd_garage (changeable on cl_utils.lua)

Config.Ranks = {  -- These are the ranks available on the shops, you can add or remove as many as you want but leave at least 1
	{ rank = 1, label = "Newbie"      },
	{ rank = 2, label = "Experienced" },
	{ rank = 3, label = "Expert"      },
	{ rank = 4, label = "Sub-Owner"   },
}

Config.AuctionsTimes = { -- Auction times to select
	{ ['h'] = 72 },
	{ ['h'] = 48 },
	{ ['h'] = 24 },
	{ ['h'] = 12 },
	{ ['h'] = 6  },
	{ ['h'] = 3  },
	{ ['h'] = 1  },
	{ ['m'] = 30 },
}

Config.Stores = { 
    {
		name = "Larry RV Sales", -- Name of the dealership
		currency = "bank", -- Used to buy/sell the business
		coords = vector3(1224.85, 2728.06, 38.0), -- Marker/Shop position for clients
		ownerCoords = vector3(1224.85, 2728.06, 38.0), -- Marker/Shop position for owner/employees
		zone = { -- Polyzone where the shop is at ( the last value of the vector3 needs to be the SAME )
			vector3(1259.34, 2695.45, 38.0),
			vector3(1241.63, 2692.67, 38.0),
			vector3(1213.79, 2691.89, 38.0),
			vector3(1202.85, 2691.54, 38.0),
			vector3(1203.41, 2728.71, 38.0),
			vector3(1208.48, 2728.04, 38.0),
			vector3(1211.19, 2732.36, 38.0),
			vector3(1210.72, 2747.03, 38.0),
			vector3(1237.43, 2747.06, 38.0),
			vector3(1237.54, 2727.18, 38.0),
			vector3(1240.53, 2723.45, 38.0),
			vector3(1244.26, 2722.60, 38.0),
			vector3(1252.13, 2721.06, 38.0),
			vector3(1253.26, 2715.91, 38.0),
			vector3(1253.08, 2705.82, 38.0),
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 523, blipColor = 3, blipScale = 0.8, blipText = "Vehicle Sales" }, -- Blip informations for dealership blip
		ownerBlip = { blipId = 523, blipColor = 2, blipScale = 0.8, blipText = "Store Panel" }, -- Blip informations for dealership you own
		buyBlip = { blipId = 523, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Store" }, -- Blip informations for dealership on sale
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "dealership1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each dealership
	}
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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


Config.BuyBusinessWebhook = true
Config.BuyBusinessWebhookColor = '65280'

Config.SellBusinessWebhook = true
Config.SellBusinessWebhookColor = '16711680'

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.FireYourselfWebhook = true
Config.FireYourselfWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'


-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de

Config.DevMode = true -- true = Can restart the script in game that everything works | false = You can't restart the script in game otherwise it stops working

Config.Debug = false -- true = Debug mode, it will show the debug messages on the console

Config.DebugZones = false -- true = Debug mode, it will show the zones created

Config.ZoneHeight = 4 -- Height of the zones

Config.ZoneSize = vec3(3, 6, 2) -- Size of the zones

Config.UseOkokNotify = true -- true = okokNotify | false = qb-notify (You can change the notification system on cl_utils.lua)

Config.UseOkokTextUI = true -- true = okokTextUI | false = qb-drawtext 

Config.UseOkokRequests = true -- true = okokRequests | false = Hire right away

Config.UseOkokBanking = true -- true = The transactions will be registered on okokBanking

Config.UseOkokChat = true -- true = When a auction starts the notification will be sent by okokChat, otherwise it will send a notification

Config.UseOkokContract = true -- true = The vehicle purchase / sell will be handled by okokContract

Config.RequireItem = false -- true = The player will need to have the item in order to open the contract

Config.ItemName = 'contract' -- Name of the item that will be required to open the contract

Config.BuyVehicleOutright = false -- true = The player will be able to purchase the vehicle outright | false = The player will have to contact one of the business employees in order to purchase it

Config.UseSameImageForVehicles = true -- true = The vehicle image will be the same

Config.PrioritizeCash = false -- If true, it will prioritize cash over bank money when you buy a vehicle

Config.Currency = '€' -- The currency used on the script

Config.CurrencyonLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.EventPrefix = "okokVehicleSales" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.StateColumn = "state" -- The column name of the state on the database

Config.MaxDealershipsPerPlayer = 5 -- How many dealership a player can own

Config.MaxEmployeesPerDealership = 10 -- How many employees a dealership can have

Config.HireDistance = 3 -- How close a player needs to be to be in the hiring range

Config.VehicleDistance = 10 -- How close a vehicle need to be to be in the vehicle range

Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

Config.ShowOwnerBlip = true -- Activate/Deactivate owner blips

Config.ShowBuyShopBlip = true -- Activate/Deactivate buy store blip

Config.UseRoadNamesToShop = true -- true = The shop will be named after the road name

Config.SubOwnerRank = 4 -- ID of the rank that will work as a secondary owner ( check the Config.Ranks )

Config.SalesHistoryLimit = 25 -- Records for each shop that will be saved on the sale history table

Config.SalesDateFormat = "%d/%m - %H:%M" -- The Date that will be shown on Sales History

Config.GarageSystem = "none" -- none / cd_garage (changeable on cl_utils.lua)

Config.Ranks = {  -- These are the ranks available on the shops, you can add or remove as many as you want but leave at least 1
	{ rank = 1, label = "Newbie"      },
	{ rank = 2, label = "Experienced" },
	{ rank = 3, label = "Expert"      },
	{ rank = 4, label = "Sub-Owner"   },
}

Config.AuctionsTimes = { -- Auction times to select
	{ ['h'] = 72 },
	{ ['h'] = 48 },
	{ ['h'] = 24 },
	{ ['h'] = 12 },
	{ ['h'] = 6  },
	{ ['h'] = 3  },
	{ ['h'] = 1  },
	{ ['m'] = 30 },
}

Config.Stores = { 
    {
		name = "Larry RV Sales", -- Name of the dealership
		currency = "bank", -- Used to buy/sell the business
		coords = vector3(1224.85, 2728.06, 38.0), -- Marker/Shop position for clients
		ownerCoords = vector3(1224.85, 2728.06, 38.0), -- Marker/Shop position for owner/employees
		zone = { -- Polyzone where the shop is at ( the last value of the vector3 needs to be the SAME )
			vector3(1259.34, 2695.45, 38.0),
			vector3(1241.63, 2692.67, 38.0),
			vector3(1213.79, 2691.89, 38.0),
			vector3(1202.85, 2691.54, 38.0),
			vector3(1203.41, 2728.71, 38.0),
			vector3(1208.48, 2728.04, 38.0),
			vector3(1211.19, 2732.36, 38.0),
			vector3(1210.72, 2747.03, 38.0),
			vector3(1237.43, 2747.06, 38.0),
			vector3(1237.54, 2727.18, 38.0),
			vector3(1240.53, 2723.45, 38.0),
			vector3(1244.26, 2722.60, 38.0),
			vector3(1252.13, 2721.06, 38.0),
			vector3(1253.26, 2715.91, 38.0),
			vector3(1253.08, 2705.82, 38.0),
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 523, blipColor = 3, blipScale = 0.8, blipText = "Vehicle Sales" }, -- Blip informations for dealership blip
		ownerBlip = { blipId = 523, blipColor = 2, blipScale = 0.8, blipText = "Store Panel" }, -- Blip informations for dealership you own
		buyBlip = { blipId = 523, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Store" }, -- Blip informations for dealership on sale
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "dealership1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each dealership
	}
}

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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


Config.BuyBusinessWebhook = true
Config.BuyBusinessWebhookColor = '65280'

Config.SellBusinessWebhook = true
Config.SellBusinessWebhookColor = '16711680'

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.FireYourselfWebhook = true
Config.FireYourselfWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'


-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}
{% endtabs %}


# okokShop

[**YouTube Video**](https://www.youtube.com/watch?v=S2G-hvwyMnE)

## **Installation Guide**

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokshop_stores`(
    `store_name` varchar(255) NOT NULL,
    `store_id` varchar(255) NOT NULL PRIMARY KEY,
    `owner` varchar(255) NULL DEFAULT NULL,
    `owner_name` varchar(255) NULL DEFAULT NULL,
    `money` varchar(255) NOT NULL,
    `business_price` varchar(255) NOT NULL,
    `current_stock` varchar(255) NOT NULL,
    `max_stock` varchar(255) NOT NULL,
    `employees` longtext NULL,
    `items` longtext NULL,
    `inactivity_date` varchar(255) DEFAULT NULL
);

CREATE TABLE `okokshop_orders`(
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `store_id` varchar(255) NOT NULL,
    `item` varchar(255) NOT NULL,
    `label` varchar(255) NOT NULL,
    `amount` varchar(255) NOT NULL,
    `reward` varchar(255) NOT NULL,
    `in_progress` varchar(255) NOT NULL,
    `employee_name` varchar(255) NOT NULL,
    `employee_id` varchar(255) NOT NULL
);

CREATE TABLE `okokshop_saleshistory`(
    `store_id` varchar(255) NOT NULL,
    `buyer_id` varchar(255) NOT NULL,
    `buyer_name` varchar(255) NOT NULL,
    `item` varchar(255) NOT NULL,
    `amount` varchar(255) NOT NULL,
    `price` varchar(255) NOT NULL,
    `date` varchar(255) NOT NULL
);
```

### Set the Discord Webhook URL (to enable logs)

Navigate to the `sv_utils.lua` file and paste the webhook URL in the line 2.

[How to create a Discord Webhook URL](https://ahsda89sgdh18923asd.gitbook.io/main/others/discord-webhook)

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de

Config.DevMode = true -- true = Can restart the script in game that everything works | false = You can't restart the script in game otherwise it stops working

Config.UseOkokNotify = true -- true = okokNotify | false = esxNotify ( You can change the notification system on cl_utils.lua )

Config.UseOkokTextUI = true -- true = okokTextUI | false = esxTextUI

Config.UseOkokRequests = true -- true = okokRequests | false = Hire right away

Config.UseOkokBanking = true -- true = The transactions will be registered on okokBanking

Config.UseOkokGasStation = true -- true = The fuel will be handled by okokGasStation

Config.Currency = '€' -- The currency used on the script

Config.CurrencyonLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.EventPrefix = "okokShop" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.MaxShopsPerPlayer = 5 -- How many shops a player can own

Config.MaxEmployeesPerShop = 10 -- How many employees a shop can have

Config.HireDistance = 3 -- How close a player needs to be to be in the hiring range

Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

Config.RewardPercentageOnOrder = 25 -- The percentage that the employee will get when doing an order depending on the capacity price ( price is 100, reward will be 25 on 25%)

Config.BuyPercentageForBusiness = 15 -- How much % a item will cost for store owners to buy from the suplier ( 4.00 = 0.60)

Config.DefaultMaxStock = 500 -- The Default max stock available after purchasing the store

Config.TotalMaxStock = 5000 -- The Max Stock available on total to upgrade the store

Config.TruckBlip = { blipId = 67, blipColor = 2, blipScale = 0.8, blipText = "Mission Truck" } -- Blip of the truck when someone accepts an order

Config.OrderBlip = { blipId = 8, blipColor = 2, blipScale = 0.8, blipText = "Shop Order", blipFinish = "Finish Order" }  -- Blip of the suplier location when someone accepts an order

Config.Marker = { id = 21, size = { x = 0.5, y = 0.5, z = 0.5 }, color = { r = 94, g = 255, b = 155 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 } -- The marker to tow a vehicle when someone accepts an order

Config.OrdersVehicle = "boxville4" -- The vehicle that will be used to deliver the orders

Config.OrderLimit = 20 -- How many items you can order at a time for order

Config.TimesToStock = 3 -- How many times a player needs to take a box to stock the truck to complete the order

Config.MaxPercentageOnPriceChange = 100 -- The max percentage that the price of the item can change from the original price ( on Config.AvailableItems ) so 100% means double the price

Config.BackDoors = true -- true = It will check 2 back doors | false will check only the trunk door

Config.TrunkOpenToGetBox = true -- true = The trunk needs to be opened in order to fill the truck

Config.BoxFrontAndBack = 2.0 -- This is to fix the X box position on the truck

Config.BoxUpAndDown = -0.1 -- This is to fix the Z box position on the truck

Config.TrunkPositionFix = -5.0 -- This is to fix the trunk position of the vehicle

Config.ShowBlips = true -- Activate/Deactivate all blips

Config.ShowOwnerBlip = true -- Activate/Deactivate owner blips

Config.ShowBuyShopBlip = true -- Activate/Deactivate buy store blip

Config.UseRoadNamesToShop = true -- true = The shop will be named after the road name

Config.DaysToRemoveShop = 15 -- How many days it will take for a shopt o be removed when no stock of all items

Config.SubOwnerRank = 4 -- ID of the rank that will work as a secondary owner ( check the Config.Ranks )

Config.Inventory = 'esx_inventoryhud/html/img/items' -- Inventory directory for the images

Config.MinimumAmountForAlert = 10 -- Minimum amount of items to show that the item needs restock

Config.SalesHistoryLimit = 25 -- Records for each shop that will be saved on the sale history table

Config.SalesDateFormat = "%d/%m - %H:%M" -- The Date that will be shown on Sales History

Config.Ranks = {  -- These are the ranks available on the shops, you can add or remove as many as you want but leave at least 1
	{ rank = 1, label = "Newbie" },
	{ rank = 2, label = "Experienced" },
	{ rank = 3, label = "Expert" },
	{ rank = 4, label = "Sub-Owner" },
}

Config.Capacities = {  -- The list of capacities available to update the max stock
	{ capacity = 100,  price = 1200 },
	{ capacity = 200,  price = 2000 },
	{ capacity = 500,  price = 3500 },
	{ capacity = 1000, price = 5000 },
}

Config.AvailableItems = { -- The list of items available to sell on the shop and the inicial price / amount
	{ name = 'phone',           label = 'Phone',          price = 4.00,   amount = 10, type = 'electronic' },
	{ name = 'electronickit',   label = 'Electronic Kit', price = 15.00,  amount = 10, type = 'electronic' },
	{ name = 'fitbit',          label = 'Fit Bit',        price = 25.00,  amount = 10, type = 'electronic' },
	{ name = 'cleaningkit',     label = 'Cleaning Kit',   price = 35.00,  amount = 10, type = 'global'     },
	{ name = 'grapejuice',      label = 'Grape Juice',    price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'firework1',       label = 'Firework',       price = 1.00,   amount = 10, type = 'global'     },
	{ name = 'sandwich',        label = 'Sandwich',       price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'lighter',         label = 'Lighter',        price = 1.00,   amount = 10, type = 'global'     },
	{ name = 'coffee',          label = 'Coffee',         price = 1.00,   amount = 10, type = 'global'     },
	{ name = 'water_bottle',    label = 'Water',  	      price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'bandage',         label = 'Bandage',        price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'screwdriverset',  label = 'Tool Kit',       price = 1.00,   amount = 10, type = 'tools'      },
	{ name = 'binoculars',      label = 'Binoculars',     price = 1.50,   amount = 10, type = 'tools'      },
}

Config.Stores = { 
    { 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(25.97, -1346.73, 29.5), -- Marker/Shop position for clients
		ownerCoords = vector3(29.67, -1339.57, 29.5), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(15.1, -1346.73, 29.19, 179.25), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		restockMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-48.05, -1757.15, 29.42), -- Marker/Shop position for clients
		ownerCoords = vector3(-44.13, -1749.44, 29.42), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-43.25, -1738.69, 28.8, 49.48), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop2", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-707.53, -913.82, 19.22), -- Marker/Shop position for clients
		ownerCoords = vector3(-709.57, -905.39, 19.22), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-700.07, -919.53, 18.59, 90.93), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop3", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-1487.68, -378.9, 40.16), -- Marker/Shop position for clients
		ownerCoords = vector3(-1483.41, -375.65, 40.16), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-1506.13, -383.92, 40.31, 47.13), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop4", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(374.27, 326.8, 103.57), -- Marker/Shop position for clients
		ownerCoords = vector3(379.2, 332.45, 103.57), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(365.74, 329.71, 103.16, 165.0), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop5", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1136.04, -982.58, 46.42), -- Marker/Shop position for clients
		ownerCoords = vector3(1130.55, -982.31, 46.42), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1138.32, -973.62, 46.2, 275.4), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop6", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1163.17, -323.28, 69.21), -- Marker/Shop position for clients
		ownerCoords = vector3(1160.12, -315.2, 69.21), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1163.89, -331.39, 68.82, 190.01), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop7", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-1222.74, -906.59, 12.33), -- Marker/Shop position for clients
		ownerCoords = vector3(-1220.41, -911.54, 12.33), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-1229.65, -896.05, 11.75, 306.23), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop8", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(2556.51, 382.39, 108.62), -- Marker/Shop position for clients
		ownerCoords = vector3(2549.66, 386.19, 108.62), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(2565.79, 384.65, 108.04, 357.62), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop9", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-2968.16, 391.53, 15.04), -- Marker/Shop position for clients
		ownerCoords = vector3(-2962.92, 390.31, 15.04), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-2969.68, 401.08, 14.67, 82.93), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop10", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-3040.16, 585.76, 7.91), -- Marker/Shop position for clients
		ownerCoords = vector3(-3047.79, 586.93, 7.91), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-3039.09, 599.64, 7.21, 290.48), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop11", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-3242.92, 1001.62, 12.83), -- Marker/Shop position for clients
		ownerCoords = vector3(-3249.49, 1005.61, 12.83), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-3239.53, 994.46, 12.01, 267.52), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop12", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(547.57, 2670.41, 42.16), -- Marker/Shop position for clients
		ownerCoords = vector3(545.17, 2663.07, 42.16), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(547.9, 2678.0, 41.72, 275.53), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop13", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1165.38, 2709.21, 38.16), -- Marker/Shop position for clients
		ownerCoords = vector3(1166.05, 2714.43, 38.16), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1161.21, 2696.02, 37.51, 182.78), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop14", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1961.1, 3741.36, 32.34), -- Marker/Shop position for clients
		ownerCoords = vector3(1960.57, 3749.11, 32.34), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1973.02, 3745.93, 31.85, 211.15), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop15", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(2678.08, 3281.05, 55.24), -- Marker/Shop position for clients
		ownerCoords = vector3(2673.8, 3287.57, 55.24), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(2685.01, 3292.36, 55.14, 241.23), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop16", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1698.72, 4924.28, 42.06), -- Marker/Shop position for clients
		ownerCoords = vector3(1706.72, 4920.81, 42.06), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1711.42, 4941.71, 42.03, 56.02), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop17", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1729.52, 6415.13, 35.04), -- Marker/Shop position for clients
		ownerCoords = vector3(1735.75, 6419.96, 35.04), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1734.86, 6401.21, 34.76, 154.55), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop18", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "Electronic Shop", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-1080.28, -246.83, 37.76), -- Marker/Shop position for clients
		ownerCoords = vector3(-1066.07, -241.6, 39.73), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-1099.63, -258.39, 37.58, 135.34), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 521, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 521, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 521, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "electronic", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop19", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "Tools Shop", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(54.32, -1738.67, 29.56), -- Marker/Shop position for clients
		ownerCoords = vector3(62.93, -1728.21, 29.61), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(55.73, -1722.11, 29.2, 52.01), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 566, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 566, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 566, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "tools", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop20", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
}


-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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


Config.BuyBusinessWebhook = true
Config.BuyBusinessWebhookColor = '65280'

Config.SellBusinessWebhook = true
Config.SellBusinessWebhookColor = '16711680'

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.FireYourselfWebhook = true
Config.FireYourselfWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'

Config.NewOrderWebhook = true
Config.NewOrderWebhookColor = '65280'

Config.OrderAcceptedWebhook = true
Config.OrderAcceptedWebhookColor = '65280'

Config.OrderCanceledWebhook = true
Config.OrderCanceledWebhookColor = '16711680'

Config.BuyItemWebhook = true
Config.BuyItemWebhookColor = '65280'


-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de

Config.DevMode = true -- true = Can restart the script in game that everything works | false = You can't restart the script in game otherwise it stops working

Config.UseOkokNotify = true -- true = okokNotify | false = qb-notify ( You can change the notification system on cl_utils.lua )

Config.UseOkokTextUI = true -- true = okokTextUI | false = qb-drawtext 

Config.UseOkokRequests = true -- true = okokRequests | false = Hire right away

Config.UseOkokBanking = true -- true = The transactions will be registered on okokBanking

Config.UseOkokGasStation = true -- true = The fuel will be handled by okokGasStation

Config.Currency = '€' -- The currency used on the script

Config.CurrencyonLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.EventPrefix = "okokShop" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.MaxShopsPerPlayer = 5 -- How many shops a player can own

Config.MaxEmployeesPerShop = 10 -- How many employees a shop can have

Config.HireDistance = 3 -- How close a player needs to be to be in the hiring range

Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

Config.RewardPercentageOnOrder = 25 -- The percentage that the employee will get when doing an order depending on the capacity price ( price is 100, reward will be 25 on 25%)

Config.BuyPercentageForBusiness = 15 -- How much % a item will cost for store owners to buy from the suplier ( 4.00 = 0.60)

Config.DefaultMaxStock = 500 -- The Default max stock available after purchasing the store

Config.TotalMaxStock = 5000 -- The Max Stock available on total to upgrade the store

Config.TruckBlip = { blipId = 67, blipColor = 2, blipScale = 0.8, blipText = "Mission Truck" } -- Blip of the truck when someone accepts an order

Config.OrderBlip = { blipId = 8, blipColor = 2, blipScale = 0.8, blipText = "Shop Order", blipFinish = "Finish Order" }  -- Blip of the suplier location when someone accepts an order

Config.Marker = { id = 21, size = { x = 0.5, y = 0.5, z = 0.5 }, color = { r = 94, g = 255, b = 155 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 } -- The marker to tow a vehicle when someone accepts an order

Config.OrdersVehicle = "boxville4" -- The vehicle that will be used to deliver the orders

Config.OrderLimit = 20 -- How many items you can order at a time for order

Config.TimesToStock = 3 -- How many times a player needs to take a box to stock the truck to complete the order

Config.MaxPercentageOnPriceChange = 100 -- The max percentage that the price of the item can change from the original price ( on Config.AvailableItems ) so 100% means double the price

Config.BackDoors = true -- true = It will check 2 back doors | false will check only the trunk door

Config.TrunkOpenToGetBox = true -- true = The trunk needs to be opened in order to fill the truck

Config.BoxFrontAndBack = 2.0 -- This is to fix the X box position on the truck

Config.BoxUpAndDown = -0.1 -- This is to fix the Z box position on the truck

Config.TrunkPositionFix = -5.0 -- This is to fix the trunk position of the vehicle

Config.ShowBlips = true -- Activate/Deactivate all blips

Config.ShowOwnerBlip = true -- Activate/Deactivate owner blips

Config.ShowBuyShopBlip = true -- Activate/Deactivate buy store blip

Config.UseRoadNamesToShop = true -- true = The shop will be named after the road name

Config.DaysToRemoveShop = 15 -- How many days it will take for a shopt o be removed when no stock of all items

Config.SubOwnerRank = 4 -- ID of the rank that will work as a secondary owner ( check the Config.Ranks )

Config.Inventory = 'qb-inventory/html/images' -- Inventory directory for the images

Config.MinimumAmountForAlert = 10 -- Minimum amount of items to show that the item needs restock

Config.SalesHistoryLimit = 25 -- Records for each shop that will be saved on the sale history table

Config.SalesDateFormat = "%d/%m - %H:%M" -- The Date that will be shown on Sales History

Config.Ranks = {  -- These are the ranks available on the shops, you can add or remove as many as you want but leave at least 1
	{ rank = 1, label = "Newbie" },
	{ rank = 2, label = "Experienced" },
	{ rank = 3, label = "Expert" },
	{ rank = 4, label = "Sub-Owner" },
}

Config.Capacities = {  -- The list of capacities available to update the max stock
	{ capacity = 100,  price = 1200 },
	{ capacity = 200,  price = 2000 },
	{ capacity = 500,  price = 3500 },
	{ capacity = 1000, price = 5000 },
}

Config.AvailableItems = { -- The list of items available to sell on the shop and the inicial price / amount
	{ name = 'phone',           label = 'Phone',          price = 4.00,   amount = 10, type = 'electronic' },
	{ name = 'electronickit',   label = 'Electronic Kit', price = 15.00,  amount = 10, type = 'electronic' },
	{ name = 'fitbit',          label = 'Fit Bit',        price = 25.00,  amount = 10, type = 'electronic' },
	{ name = 'cleaningkit',     label = 'Cleaning Kit',   price = 35.00,  amount = 10, type = 'global'     },
	{ name = 'grapejuice',      label = 'Grape Juice',    price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'firework1',       label = 'Firework',       price = 1.00,   amount = 10, type = 'global'     },
	{ name = 'sandwich',        label = 'Sandwich',       price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'lighter',         label = 'Lighter',        price = 1.00,   amount = 10, type = 'global'     },
	{ name = 'coffee',          label = 'Coffee',         price = 1.00,   amount = 10, type = 'global'     },
	{ name = 'water_bottle',    label = 'Water',  	      price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'bandage',         label = 'Bandage',        price = 2.00,   amount = 10, type = 'global'     },
	{ name = 'screwdriverset',  label = 'Tool Kit',       price = 1.00,   amount = 10, type = 'tools'      },
	{ name = 'binoculars',      label = 'Binoculars',     price = 1.50,   amount = 10, type = 'tools'      },
}

Config.Stores = { 
    { 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(25.97, -1346.73, 29.5), -- Marker/Shop position for clients
		ownerCoords = vector3(29.67, -1339.57, 29.5), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(15.1, -1346.73, 29.19, 179.25), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		restockMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-48.05, -1757.15, 29.42), -- Marker/Shop position for clients
		ownerCoords = vector3(-44.13, -1749.44, 29.42), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-43.25, -1738.69, 28.8, 49.48), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop2", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-707.53, -913.82, 19.22), -- Marker/Shop position for clients
		ownerCoords = vector3(-709.57, -905.39, 19.22), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-700.07, -919.53, 18.59, 90.93), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop3", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-1487.68, -378.9, 40.16), -- Marker/Shop position for clients
		ownerCoords = vector3(-1483.41, -375.65, 40.16), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-1506.13, -383.92, 40.31, 47.13), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop4", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(374.27, 326.8, 103.57), -- Marker/Shop position for clients
		ownerCoords = vector3(379.2, 332.45, 103.57), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(365.74, 329.71, 103.16, 165.0), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop5", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1136.04, -982.58, 46.42), -- Marker/Shop position for clients
		ownerCoords = vector3(1130.55, -982.31, 46.42), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1138.32, -973.62, 46.2, 275.4), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop6", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1163.17, -323.28, 69.21), -- Marker/Shop position for clients
		ownerCoords = vector3(1160.12, -315.2, 69.21), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1163.89, -331.39, 68.82, 190.01), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop7", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-1222.74, -906.59, 12.33), -- Marker/Shop position for clients
		ownerCoords = vector3(-1220.41, -911.54, 12.33), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-1229.65, -896.05, 11.75, 306.23), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop8", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(2556.51, 382.39, 108.62), -- Marker/Shop position for clients
		ownerCoords = vector3(2549.66, 386.19, 108.62), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(2565.79, 384.65, 108.04, 357.62), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop9", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-2968.16, 391.53, 15.04), -- Marker/Shop position for clients
		ownerCoords = vector3(-2962.92, 390.31, 15.04), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-2969.68, 401.08, 14.67, 82.93), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop10", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-3040.16, 585.76, 7.91), -- Marker/Shop position for clients
		ownerCoords = vector3(-3047.79, 586.93, 7.91), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-3039.09, 599.64, 7.21, 290.48), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop11", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-3242.92, 1001.62, 12.83), -- Marker/Shop position for clients
		ownerCoords = vector3(-3249.49, 1005.61, 12.83), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-3239.53, 994.46, 12.01, 267.52), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop12", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(547.57, 2670.41, 42.16), -- Marker/Shop position for clients
		ownerCoords = vector3(545.17, 2663.07, 42.16), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(547.9, 2678.0, 41.72, 275.53), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop13", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1165.38, 2709.21, 38.16), -- Marker/Shop position for clients
		ownerCoords = vector3(1166.05, 2714.43, 38.16), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1161.21, 2696.02, 37.51, 182.78), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop14", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1961.1, 3741.36, 32.34), -- Marker/Shop position for clients
		ownerCoords = vector3(1960.57, 3749.11, 32.34), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1973.02, 3745.93, 31.85, 211.15), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop15", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(2678.08, 3281.05, 55.24), -- Marker/Shop position for clients
		ownerCoords = vector3(2673.8, 3287.57, 55.24), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(2685.01, 3292.36, 55.14, 241.23), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop16", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1698.72, 4924.28, 42.06), -- Marker/Shop position for clients
		ownerCoords = vector3(1706.72, 4920.81, 42.06), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1711.42, 4941.71, 42.03, 56.02), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop17", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "24/7", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(1729.52, 6415.13, 35.04), -- Marker/Shop position for clients
		ownerCoords = vector3(1735.75, 6419.96, 35.04), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(1734.86, 6401.21, 34.76, 154.55), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 59, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 59, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 59, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "global", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop18", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "Electronic Shop", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(-1080.28, -246.83, 37.76), -- Marker/Shop position for clients
		ownerCoords = vector3(-1066.07, -241.6, 39.73), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(-1099.63, -258.39, 37.58, 135.34), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 521, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 521, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 521, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "electronic", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop19", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
	{ 
		name = "Tools Shop", -- Name of the shop
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- true = this shop can have a owner and will need maintenance to have stock
		coords = vector3(54.32, -1738.67, 29.56), -- Marker/Shop position for clients
		ownerCoords = vector3(62.93, -1728.21, 29.61), -- Marker/Shop position for owner/employees
		spawnMissionVehicle = vector4(55.73, -1722.11, 29.2, 52.01), -- Where the vehicles are spawned for the missions
        missionsVehicleSpawn = { -- Locations where someone who accepted an order will have to go (it is random)
			vector3(978.86, -1565.49, 30.78),
			vector3(-104.00, 37.50, 71.48),
			vector3(-2034.87, -274.73, 23.39)
		},
		radius = 1, -- Interaction radius for the markers
		price = 20000, -- Price of the Shop
		blip = { blipId = 566, blipColor = 3, blipScale = 0.8, blipText = "24/7" }, -- Blip informations for shop blip
		ownerBlip = { blipId = 566, blipColor = 2, blipScale = 0.8, blipText = "Shop Panel" }, -- Blip informations for shops you own
		buyBlip = { blipId = 566, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Shop" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the shop
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		type = "tools", -- Type of the shop used on the Config.AvailableItems ( must exist on the list )
		id = "shop20", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	},
}


-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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


Config.BuyBusinessWebhook = true
Config.BuyBusinessWebhookColor = '65280'

Config.SellBusinessWebhook = true
Config.SellBusinessWebhookColor = '16711680'

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.FireYourselfWebhook = true
Config.FireYourselfWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'

Config.NewOrderWebhook = true
Config.NewOrderWebhookColor = '65280'

Config.OrderAcceptedWebhook = true
Config.OrderAcceptedWebhookColor = '65280'

Config.OrderCanceledWebhook = true
Config.OrderCanceledWebhookColor = '16711680'

Config.BuyItemWebhook = true
Config.BuyItemWebhookColor = '65280'


-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}
{% endtabs %}


# okokGasStation

[**YouTube Video**](https://www.youtube.com/watch?v=aZs14PhkCm0)

## **Installation Guide**

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokgasstation_stores`(
    `store_name` varchar(255) NOT NULL,
    `store_id` varchar(255) NOT NULL PRIMARY KEY,
    `owner` varchar(255) NULL DEFAULT NULL,
    `owner_name` varchar(255) NULL DEFAULT NULL,
    `money` varchar(255) NOT NULL,
    `business_price` varchar(255) NOT NULL,
    `gas_price` DECIMAL(10, 2) NOT NULL DEFAULT 2.00,
    `current_stock` varchar(255) NOT NULL,
    `max_stock` varchar(255) NOT NULL,
    `employees` longtext NULL,
    `vehicles` longtext NULL,
    `inactivity_date` varchar(255) DEFAULT NULL
);

CREATE TABLE `okokgasstation_orders`(
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `store_id` varchar(255) NOT NULL,
    `liters` varchar(255) NOT NULL,
    `vehicle` varchar(255) NOT NULL,
    `long_vehicle` varchar(255) NOT NULL,
    `reward` varchar(255) NOT NULL,
    `in_progress` varchar(255) NOT NULL,
    `employee_name` varchar(255) NOT NULL,
    `employee_id` varchar(255) NOT NULL
);

CREATE TABLE `okokgasstation_saleshistory`(
    `store_id` varchar(255) NOT NULL,
    `buyer_id` varchar(255) NOT NULL,
    `buyer_name` varchar(255) NOT NULL,
    `liters` varchar(255) NOT NULL,
    `price` varchar(255) NOT NULL,
    `date` varchar(255) NOT NULL
);
```

### Exports

```lua
exports['okokGasStation']:GetFuel(vehicle)
exports['okokGasStation']:SetFuel(vehicle, fuel)
exports['okokGasStation']:AddGasStationFuel(gasStationID, fuel)
exports['okokGasStation']:RemoveGasStationFuel(gasStationID, fuel)
```

### Set the Discord Webhook URL (to enable logs)

Navigate to the `sv_utils.lua` file and paste the webhook URL in the line 2.

[How to create a Discord Webhook URL](https://ahsda89sgdh18923asd.gitbook.io/main/others/discord-webhook)

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de / nl

Config.DevMode = true -- true = Can restart the script in game that everything works | false = You can't restart the script in game otherwise it stops working

Config.Debug = false

Config.UseOkokNotify = true -- true = okokNotify | false = qb-notify ( You can change the notification system on cl_utils.lua )

Config.UseOkokTextUI = true -- true = okokTextUI | false = qb-drawtext 

Config.UseOkokRequests = true -- true = okokRequests | false = Hire right away

Config.UseOkokBanking = true -- true = The transactions will be registered on okokBanking

Config.Currency = '€' -- The currency used on the script

Config.CurrencyonLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.EventPrefix = "okokGasStation" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.MaxGasStationsPerPlayer = 5 -- How many gas stations a player can own

Config.MaxEmployeesPerGasStation = 10 -- How many employees a gas station can have

Config.UseRopeToRefuel = true -- true = You will need to use a rope to refuel the vehicles | false = You can refuel the vehicles without a rope

Config.HireDistance = 3 -- How close a player needs to be to be in the hiring range

Config.MaxGasPrice = 10 -- The max price a player can set the gas price to

Config.ShowOwnerBlip = true -- Activate/Deactivate owner blips

Config.ShowBuyGasStationBlip = true -- Activate/Deactivate buy store blip

Config.ShowGasStationBlip = false -- Activate/Deactivate the normal blips if you set Config.ShowBuyGasStationBlip = false

Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

Config.DefaultGasPrice = 2.00 -- Default price for gas after purchasing a store

Config.DefaultMaxStock = 2000 -- The Default max stock available after purchasing the store

Config.TotalMaxStock = 20000 -- The Max Stock available on total to upgrade the store

Config.RewardPercentageOnOrder = 10 -- The percentage that the employee will get when doing an order depending on the capacity price ( price is 750, reward will be 75 on 10%)

Config.SalesDateFormat = "%d/%m - %H:%M" -- The Date that will be shown on Sales History

Config.TruckBlip = { blipId = 67, blipColor = 2, blipScale = 0.8, blipText = "Mission Truck" } -- Blip of the truck when someone accepts an order

Config.OrderBlip = { blipId = 8, blipColor = 2, blipScale = 0.8, blipText = "Fuel Order", blipFinish = "Finish Order" }  -- Blip of the gas location when someone accepts an order

Config.Marker = { id = 21, size = { x = 0.5, y = 0.5, z = 0.5 }, color = { r = 31, g = 94, b = 255, a = 90 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 } -- The marker to tow a vehicle when someone accepts an order

Config.TrailerName = 'Tanker' -- Name of the trailer for the long vehicles mission

Config.SubOwnerRank = 4 -- ID of the rank that will work as a secondary owner ( check the Config.Ranks )

Config.PrioritizeCash = true -- If true, it will prioritize cash over bank money when you refuel

Config.SalesHistoryLimit = 25 -- Records for each shop that will be saved on the sale history table

Config.EnableJerrycan = true --  You can use the jerrycan to refuel vehicles | false = You can't use the jerrycan to refuel vehicles

Config.TurnOffEngineWhenNoFuel = true -- The engine will turn off when the vehicle has no fuel

Config.TurnOnEngineWhenFuel = false -- The engine will turn on when the vehicle has fuel

Config.DaysToRemoveGasStation = 15 -- How many days will take after a gas station has no stock to remove the owner

Config.RefuelTime = 1000 -- Time in ms per liter to refuel a vehicle

Config.UseMetadataItem = false -- true = You will need the item to refuel the vehicle | false = You can refuel the vehicle without the item

Config.MetadataInventory = 'qs-inventory' -- The inventory script you are using ( qs-inventory / ox_inventory )

Config.FreezePedWhileFueling = false -- true = The player will be frozen while refueling | false = The player will be able to move while refueling

Config.DistanceBetweenPumpAndVehicle = 5 -- The distance between the vehicle and the pump to refuel

Config.Ranks = {  -- These are the ranks available on the gas station stores, you can add or remove as many as you want but leave at least 1
	{ rank = 1, label = "Newbie" },
	{ rank = 2, label = "Experienced" },
	{ rank = 3, label = "Expert" },
	{ rank = 4, label = "Sub-Owner" },
 }

Config.Capacities = {  -- The list of capacities available to update the max stock
	{ capacity = 500,   price = 750 },
	{ capacity = 1000,  price = 1200 },
	{ capacity = 2000,  price = 2000 },
	{ capacity = 5000,  price = 3500 },
	{ capacity = 10000, price = 5000 },
 }

Config.RopePositions = {  -- Change the coords if the rope is not in the right position
	{ vehicle = 'hotknife', x = -0.65,  y = -1.50, z = -0.30 }, -- X = forward and backward | Y = left and right | Z = up and down
	{ vehicle = 'forklift', x = -0.45,  y = -1.00, z = -0.25 },
	{ vehicle = 'bus', 	    x = -1.25,  y = 0.00,  z = -1.10 },
	{ vehicle = 'firetruk', x = -0.90,  y = 0.00,  z = -0.55 },
 }

Config.Stores = { 
    { 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 2680.2, y = 3264.06, z = 55.24 }, -- Marker/Shop position
		ownerCoords = { x = 2674.07, y = 3266.96, z = 55.24 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 2690.84, y = 3271.46, z = 55.31, h = 151.13 }, -- Where the vehicles are spawned for the missions
		refuelLocations = {  -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 2681.59, y = 3266.09, z = 55.41 },
			{ x = 2679.09, y = 3261.97, z = 55.41 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 1687.28, y = 4929.37, z = 42.08 }, -- Marker/Shop position
		ownerCoords = { x = 1702.48, y = 4916.58, z = 42.08 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 1713.06, y = 4940.35, z = 42.18, h = 55.39 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 1684.00, y = 4932.12, z = 42.23 },
			{ x = 1689.53, y = 4928.31, z = 42.23 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation2", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = -1800.2, y = 803.85, z = 138.65 }, -- Marker/Shop position
		ownerCoords = { x = -1818.59, y = 796.98, z = 138.14 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = -1813.31, y = 788.29, z = 137.83, h = 222.49 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = -1790.39, y = 806.88, z = 138.69 },
			{ x = -1795.5, y = 812.38, z = 138.69 },
			{ x = -1801.85, y = 806.47, z = 138.65 },
			{ x = -1796.76, y = 800.92, z = 138.65 },
			{ x = -1803.19, y = 794.79, z = 138.69 },
			{ x = -1808.28, y = 800.34, z = 138.68 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation3", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = -724.04, y = -934.02, z = 19.21 }, -- Marker/Shop position
		ownerCoords = { x = -702.82, y = -917.17, z = 19.21 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = -727.35, y = -912.4, z = 19.08, h = 179.75 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = -714.86, y = -939.36, z = 19.2 },
			{ x = -714.85, y = -932.52, z = 19.21 },
			{ x = -723.42, y = -932.51, z = 19.21 },
			{ x = -723.51, y = -939.4, z = 19.2 },
			{ x = -732.06, y = -939.42, z = 19.2 },
			{ x = -732.06, y = -932.51, z = 19.21 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation4", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = -70.79, y = -1762.41, z = 29.53 }, -- Marker/Shop position
		ownerCoords = { x = -57.85, y = -1754.48, z = 29.2 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = -39.27, y = -1742.14, z = 29.31, h = 51.75 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = -80.71, y = -1761.92, z = 29.8 },
			{ x = -78.14, y = -1754.86, z = 29.8 },
			{ x = -70.0, y = -1757.81, z = 29.53 },
			{ x = -72.59, y = -1764.91, z = 29.53 },
			{ x = -61.56, y = -1760.6, z = 29.26 },
			{ x = -64.13, y = -1767.65, z = 29.26 },
		 },		
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 25000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation5", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 1181.56, y = -330.21, z = 69.32 }, -- Marker/Shop position
		ownerCoords = { x = 1167.89, y = -321.23, z = 69.3 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 1166.88, y = -331.53, z = 68.98, h = 188.59 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 1183.23, y = -320.38, z = 69.34 },
			{ x = 1175.57, y = -321.74, z = 69.35 },
			{ x = 1177.43, y = -330.42, z = 69.32 },
			{ x = 1184.78, y = -329.13, z = 69.32 },
			{ x = 1186.34, y = -337.66, z = 69.36 },
			{ x = 1178.88, y = -338.96, z = 69.36 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation6", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 2581.32, y = 361.8, z = 108.47 }, -- Marker/Shop position
		ownerCoords = { x = 2559.4, y = 373.76, z = 108.62 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 2589.75, y = 409.23, z = 108.52, h =  2.98 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 2574.13, y = 359.14, z = 108.65 },
			{ x = 2574.43, y = 364.67, z = 108.65 },
			{ x = 2580.59, y = 364.56, z = 108.65 },
			{ x = 2580.35, y = 358.91, z = 108.65 },
			{ x = 2587.83, y = 358.73, z = 108.65 },
			{ x = 2588.07, y = 364.12, z = 108.65 }
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 }, 
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation7", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
 }

Config.PumpModels = {  -- Set the pump models you want to use - https://gta-objects.xyz/objects/search?text=pump
	[-2007231801] = true,
	[1339433404] = true,
	[1694452750] = true,
	[1933174915] = true,
	[-462817101] = true,
	[-469694731] = true,
	[-164877493] = true
 }

Config.ConsumptionClasses = {  -- Set the level of consume when the car is stopped but with engine on 
	[0]  = 0.04, -- Compacts
	[1]  = 0.05, -- Sedans
	[2]  = 0.06, -- SUVs
	[3]  = 0.08, -- Coupes
	[4]  = 0.08, -- Muscle
	[5]  = 0.10, -- Sports Classics
	[6]  = 0.12, -- Sports
	[7]  = 0.20, -- Super
	[8]  = 0.05, -- Motorcycles
	[9]  = 0.08, -- Off-road
	[10] = 0.10, -- Industrial
	[11] = 0.09, -- Utility
	[12] = 0.08, -- Vans
	[13] = 0.00, -- Cycles
	[14] = 0.00, -- Boats
	[15] = 0.00, -- Helicopters
	[16] = 0.00, -- Planes
	[17] = 0.09, -- Service
	[18] = 0.10, -- Emergency
	[19] = 0.10, -- Military
	[20] = 0.15, -- Commercial
	[21] = 0.00, -- Trains
 }

Config.FuelUsageByRPM = {  -- The first value is the RPM, the second value it is how much fuel it will be removed from the tank each second
	[1.0] = 1.4,
	[0.9] = 1.2,
	[0.8] = 1.0,
	[0.7] = 0.9,
	[0.6] = 0.8,
	[0.5] = 0.7,
	[0.4] = 0.5,
	[0.3] = 0.4,
	[0.2] = 0.2,
	[0.1] = 0.1,
	[0.0] = 0.0,
 }

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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


Config.BuyBusinessWebhook = true
Config.BuyBusinessWebhookColor = '65280'

Config.SellBusinessWebhook = true
Config.SellBusinessWebhookColor = '16711680'

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.FireYourselfWebhook = true
Config.FireYourselfWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'

Config.EditGasPriceWebhook = true
Config.EditGasPriceWebhookColor = '65280'

Config.salesHistoryWebhook = true
Config.salesHistoryWebhookColor = '65280'

Config.NewOrderWebhook = true
Config.NewOrderWebhookColor = '65280'

Config.OrderAcceptedWebhook = true
Config.OrderAcceptedWebhookColor = '65280'

Config.OrderCanceledWebhook = true
Config.OrderCanceledWebhookColor = '16711680'


-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Locale = 'en' -- en / pt / es / fr / de / nl

Config.DevMode = true -- true = Can restart the script in game that everything works | false = You can't restart the script in game otherwise it stops working

Config.Debug = false

Config.UseOkokNotify = true -- true = okokNotify | false = qb-notify ( You can change the notification system on cl_utils.lua )

Config.UseOkokTextUI = true -- true = okokTextUI | false = qb-drawtext 

Config.UseOkokRequests = true -- true = okokRequests | false = Hire right away

Config.UseOkokBanking = true -- true = The transactions will be registered on okokBanking

Config.Currency = '€' -- The currency used on the script

Config.CurrencyonLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.EventPrefix = "okokGasStation" -- This will change the prefix of the events name so if Config.EventPrefix = "example" the events will be "example:event"

Config.MaxGasStationsPerPlayer = 5 -- How many gas stations a player can own

Config.MaxEmployeesPerGasStation = 10 -- How many employees a gas station can have

Config.UseRopeToRefuel = true -- true = You will need to use a rope to refuel the vehicles | false = You can refuel the vehicles without a rope

Config.HireDistance = 3 -- How close a player needs to be to be in the hiring range

Config.MaxGasPrice = 10 -- The max price a player can set the gas price to

Config.ShowOwnerBlip = true -- Activate/Deactivate owner blips

Config.ShowBuyGasStationBlip = true -- Activate/Deactivate buy store blip

Config.ShowGasStationBlip = false -- Activate/Deactivate the normal blips if you set Config.ShowBuyGasStationBlip = false

Config.SellBusinessReceivePercentage = 50 -- How much % a player will receive for selling his business (in percentage, 50 = 50%)

Config.DefaultGasPrice = 2.00 -- Default price for gas after purchasing a store

Config.DefaultMaxStock = 2000 -- The Default max stock available after purchasing the store

Config.TotalMaxStock = 20000 -- The Max Stock available on total to upgrade the store

Config.RewardPercentageOnOrder = 10 -- The percentage that the employee will get when doing an order depending on the capacity price ( price is 750, reward will be 75 on 10%)

Config.SalesDateFormat = "%d/%m - %H:%M" -- The Date that will be shown on Sales History

Config.TruckBlip = { blipId = 67, blipColor = 2, blipScale = 0.8, blipText = "Mission Truck" } -- Blip of the truck when someone accepts an order

Config.OrderBlip = { blipId = 8, blipColor = 2, blipScale = 0.8, blipText = "Fuel Order", blipFinish = "Finish Order" }  -- Blip of the gas location when someone accepts an order

Config.Marker = { id = 21, size = { x = 0.5, y = 0.5, z = 0.5 }, color = { r = 31, g = 94, b = 255, a = 90 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 } -- The marker to tow a vehicle when someone accepts an order

Config.TrailerName = 'Tanker' -- Name of the trailer for the long vehicles mission

Config.SubOwnerRank = 4 -- ID of the rank that will work as a secondary owner ( check the Config.Ranks )

Config.PrioritizeCash = true -- If true, it will prioritize cash over bank money when you refuel

Config.SalesHistoryLimit = 25 -- Records for each shop that will be saved on the sale history table

Config.EnableJerrycan = true --  You can use the jerrycan to refuel vehicles | false = You can't use the jerrycan to refuel vehicles

Config.TurnOffEngineWhenNoFuel = true -- The engine will turn off when the vehicle has no fuel

Config.TurnOnEngineWhenFuel = false -- The engine will turn on when the vehicle has fuel

Config.DaysToRemoveGasStation = 15 -- How many days will take after a gas station has no stock to remove the owner

Config.RefuelTime = 1000 -- Time in ms per liter to refuel a vehicle

Config.UseMetadataItem = false -- true = You will need the item to refuel the vehicle | false = You can refuel the vehicle without the item

Config.MetadataInventory = 'qs-inventory' -- The inventory script you are using ( qs-inventory / ox_inventory )

Config.FreezePedWhileFueling = false -- true = The player will be frozen while refueling | false = The player will be able to move while refueling

Config.DistanceBetweenPumpAndVehicle = 5 -- The distance between the vehicle and the pump to refuel

Config.Ranks = {  -- These are the ranks available on the gas station stores, you can add or remove as many as you want but leave at least 1
	{ rank = 1, label = "Newbie" },
	{ rank = 2, label = "Experienced" },
	{ rank = 3, label = "Expert" },
	{ rank = 4, label = "Sub-Owner" },
 }

Config.Capacities = {  -- The list of capacities available to update the max stock
	{ capacity = 500,   price = 750 },
	{ capacity = 1000,  price = 1200 },
	{ capacity = 2000,  price = 2000 },
	{ capacity = 5000,  price = 3500 },
	{ capacity = 10000, price = 5000 },
 }

Config.RopePositions = {  -- Change the coords if the rope is not in the right position
	{ vehicle = 'hotknife', x = -0.65,  y = -1.50, z = -0.30 }, -- X = forward and backward | Y = left and right | Z = up and down
	{ vehicle = 'forklift', x = -0.45,  y = -1.00, z = -0.25 },
	{ vehicle = 'bus', 	    x = -1.25,  y = 0.00,  z = -1.10 },
	{ vehicle = 'firetruk', x = -0.90,  y = 0.00,  z = -0.55 },
 }

Config.Stores = { 
    {
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 2680.2, y = 3264.06, z = 55.24 }, -- Marker/Shop position
		ownerCoords = { x = 2674.07, y = 3266.96, z = 55.24 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 2690.84, y = 3271.46, z = 55.31, h = 151.13 }, -- Where the vehicles are spawned for the missions
		refuelLocations = {  -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 2681.59, y = 3266.09, z = 55.41 },
			{ x = 2679.09, y = 3261.97, z = 55.41 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation1", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 1687.28, y = 4929.37, z = 42.08 }, -- Marker/Shop position
		ownerCoords = { x = 1702.48, y = 4916.58, z = 42.08 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 1713.06, y = 4940.35, z = 42.18, h = 55.39 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 1684.00, y = 4932.12, z = 42.23 },
			{ x = 1689.53, y = 4928.31, z = 42.23 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation2", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = -1800.2, y = 803.85, z = 138.65 }, -- Marker/Shop position
		ownerCoords = { x = -1818.59, y = 796.98, z = 138.14 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = -1813.31, y = 788.29, z = 137.83, h = 222.49 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = -1790.39, y = 806.88, z = 138.69 },
			{ x = -1795.5, y = 812.38, z = 138.69 },
			{ x = -1801.85, y = 806.47, z = 138.65 },
			{ x = -1796.76, y = 800.92, z = 138.65 },
			{ x = -1803.19, y = 794.79, z = 138.69 },
			{ x = -1808.28, y = 800.34, z = 138.68 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation3", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = -724.04, y = -934.02, z = 19.21 }, -- Marker/Shop position
		ownerCoords = { x = -702.82, y = -917.17, z = 19.21 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = -727.35, y = -912.4, z = 19.08, h = 179.75 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = -714.86, y = -939.36, z = 19.2 },
			{ x = -714.85, y = -932.52, z = 19.21 },
			{ x = -723.42, y = -932.51, z = 19.21 },
			{ x = -723.51, y = -939.4, z = 19.2 },
			{ x = -732.06, y = -939.42, z = 19.2 },
			{ x = -732.06, y = -932.51, z = 19.21 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation4", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = -70.79, y = -1762.41, z = 29.53 }, -- Marker/Shop position
		ownerCoords = { x = -57.85, y = -1754.48, z = 29.2 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = -39.27, y = -1742.14, z = 29.31, h = 51.75 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = -80.71, y = -1761.92, z = 29.8 },
			{ x = -78.14, y = -1754.86, z = 29.8 },
			{ x = -70.0, y = -1757.81, z = 29.53 },
			{ x = -72.59, y = -1764.91, z = 29.53 },
			{ x = -61.56, y = -1760.6, z = 29.26 },
			{ x = -64.13, y = -1767.65, z = 29.26 },
		 },		
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 25000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation5", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 1181.56, y = -330.21, z = 69.32 }, -- Marker/Shop position
		ownerCoords = { x = 1167.89, y = -321.23, z = 69.3 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 1166.88, y = -331.53, z = 68.98, h = 188.59 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 1183.23, y = -320.38, z = 69.34 },
			{ x = 1175.57, y = -321.74, z = 69.35 },
			{ x = 1177.43, y = -330.42, z = 69.32 },
			{ x = 1184.78, y = -329.13, z = 69.32 },
			{ x = 1186.34, y = -337.66, z = 69.36 },
			{ x = 1178.88, y = -338.96, z = 69.36 },
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 },
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation6", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
	{ 
		name = "Gas Station", -- Name of the gas station
		currency = "bank", -- Used to buy/sell the business
		hasOwner = true, -- If true, the gas station will have an owner
		coords = { x = 2581.32, y = 361.8, z = 108.47 }, -- Marker/Shop position
		ownerCoords = { x = 2559.4, y = 373.76, z = 108.62 }, -- Marker/Shop position for owner/employees
		spawnMissionVehicle = { x = 2589.75, y = 409.23, z = 108.52, h =  2.98 }, -- Where the vehicles are spawned for the missions
		refuelLocations = { -- Locations where players can refuel their vehicle ( should be close to a pump )
			{ x = 2574.13, y = 359.14, z = 108.65 },
			{ x = 2574.43, y = 364.67, z = 108.65 },
			{ x = 2580.59, y = 364.56, z = 108.65 },
			{ x = 2580.35, y = 358.91, z = 108.65 },
			{ x = 2587.83, y = 358.73, z = 108.65 },
			{ x = 2588.07, y = 364.12, z = 108.65 }
		 },
		smallVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for small vehicles
			{ x = 1524.23, y = -2113.95, z = 76.6, h = 93.54 }, 
			{ x = 865.68, y = -3206.11, z = 5.9, h = 2.46 },
			{ x = -356.36, y = 6068.12, z = 31.5, h = 228.11 },
		 },
		longVehiclesGetFuel = {  -- Locations where someone who accepted an order will have to go (it is random) and it is for trucks with trailers
			{ x = 168.38, y = 6432.32, z = 31.28, h = 75.94 },
			{ x = 1712.04, y = -1573.69, z = 112.6, h = 271.11 },
			{ x = 1271.91, y = -3191.07, z = 5.9, h = 93.71 },
		 },
		vehicles = {  -- Inserted on the database after the gas station purchase, then you can't change this info
			{ label ='Rumpo', vehicleid = 'rumpo', price = 32000, capacity = 500, orderPrice = 1200, owned = false, longTruck = false },
			{ label ='Mule', vehicleid = 'mule', price = 54000, capacity = 1500, orderPrice = 2500, owned = false, longTruck = false },
			{ label ='Phantom', vehicleid = 'phantom', price = 180000, capacity = 10000, orderPrice = 7000, owned = false, longTruck = true },
		 },
		radius = 1, -- Interaction radius for the markers
		pumpRadius = 15, -- Interaction radius for the pumps
		price = 20000, -- Price of the Gas Station
		startStock = 500, -- The stock of fuel the business starts with
		blip = { blipId = 415, blipColor = 3, blipScale = 0.8, blipText = "Gas Station" }, -- Blip informations for gas station blip
		ownerBlip = { blipId = 415, blipColor = 2, blipScale = 0.8, blipText = "Gas Station Panel" }, -- Blip informations for shops your own/work gas station
		buyBlip = { blipId = 415, blipColor = 1, blipScale = 0.8, blipText = "Purchasable Gas Station" }, -- Blip informations for shop on sale
		marker = { id = 20, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the gas station
		ownerMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		refuelMarker = { id = 21, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.5, y = 0.5, z = 0.5 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0 }, -- Marker informations for the owning menu
		id = "gasstation7", -- ID of the shop, it's used to get what shop is opened | needs to be DIFFERENT for each shop
	 },
 }

Config.PumpModels = {  -- Set the pump models you want to use - https://gta-objects.xyz/objects/search?text=pump
	[-2007231801] = true,
	[1339433404] = true,
	[1694452750] = true,
	[1933174915] = true,
	[-462817101] = true,
	[-469694731] = true,
	[-164877493] = true
 }

Config.ConsumptionClasses = {  -- Set the level of consume when the car is stopped but with engine on 
	[0]  = 0.04, -- Compacts
	[1]  = 0.05, -- Sedans
	[2]  = 0.06, -- SUVs
	[3]  = 0.08, -- Coupes
	[4]  = 0.08, -- Muscle
	[5]  = 0.10, -- Sports Classics
	[6]  = 0.12, -- Sports
	[7]  = 0.20, -- Super
	[8]  = 0.05, -- Motorcycles
	[9]  = 0.08, -- Off-road
	[10] = 0.10, -- Industrial
	[11] = 0.09, -- Utility
	[12] = 0.08, -- Vans
	[13] = 0.00, -- Cycles
	[14] = 0.00, -- Boats
	[15] = 0.00, -- Helicopters
	[16] = 0.00, -- Planes
	[17] = 0.09, -- Service
	[18] = 0.10, -- Emergency
	[19] = 0.10, -- Military
	[20] = 0.15, -- Commercial
	[21] = 0.00, -- Trains
 }

Config.FuelUsageByRPM = {  -- The first value is the RPM, the second value it is how much fuel it will be removed from the tank each second
	[1.0] = 1.4,
	[0.9] = 1.2,
	[0.8] = 1.0,
	[0.7] = 0.9,
	[0.6] = 0.8,
	[0.5] = 0.7,
	[0.4] = 0.5,
	[0.3] = 0.4,
	[0.2] = 0.2,
	[0.1] = 0.1,
	[0.0] = 0.0,
 }

-------------------------- DISCORD LOGS

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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


Config.BuyBusinessWebhook = true
Config.BuyBusinessWebhookColor = '65280'

Config.SellBusinessWebhook = true
Config.SellBusinessWebhookColor = '16711680'

Config.DepositWebhook = true
Config.DepositWebhookColor = '65280'

Config.WithdrawWebhook = true
Config.WithdrawWebhookColor = '16711680'

Config.HireWebhook = true
Config.HireWebhookColor = '65280'

Config.FireWebhook = true
Config.FireWebhookColor = '16711680'

Config.FireYourselfWebhook = true
Config.FireYourselfWebhookColor = '16711680'

Config.EditEmployeeRankWebhook = true
Config.EditEmployeeRankWebhookColor = '65280'

Config.EditGasPriceWebhook = true
Config.EditGasPriceWebhookColor = '65280'

Config.salesHistoryWebhook = true
Config.salesHistoryWebhookColor = '65280'

Config.NewOrderWebhook = true
Config.NewOrderWebhookColor = '65280'

Config.OrderAcceptedWebhook = true
Config.OrderAcceptedWebhookColor = '65280'

Config.OrderCanceledWebhook = true
Config.OrderCanceledWebhookColor = '16711680'


-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```

{% endtab %}
{% endtabs %}


# okokTuning

[**YouTube Video**](https://www.youtube.com/watch?v=vCauIZMOxkI)

## **Installation Guide**

### Requirements

ox\_lib (<https://github.com/overextended/ox_lib/releases/latest/download/ox_lib.zip>).

{% embed url="<https://github.com/overextended/ox_lib/releases>" %}

### **ESX**

Navigate to **es\_extended/client/functions.lua** and entirely replace the following functions:

{% tabs %}
{% tab title="ESX.Game.GetVehicleProperties" %}

```lua
function ESX.Game.GetVehicleProperties(vehicle)
    if DoesEntityExist(vehicle) then
        local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)

        local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
        if GetIsVehiclePrimaryColourCustom(vehicle) then
            local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
            colorPrimary = {r, g, b}
        end

        if GetIsVehicleSecondaryColourCustom(vehicle) then
            local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
            colorSecondary = {r, g, b}
        end

        local extras = {}
        for extraId = 0, 12 do
            if DoesExtraExist(vehicle, extraId) then
                local state = IsVehicleExtraTurnedOn(vehicle, extraId) == 1
                extras[tostring(extraId)] = state
            end
        end

        local modLivery = GetVehicleMod(vehicle, 48)
        if GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) ~= 0 then
            modLivery = GetVehicleLivery(vehicle)
        end

        local tireHealth = {}
        for i = 0, 3 do
            tireHealth[i] = GetVehicleWheelHealth(vehicle, i)
        end

        local tireBurstState = {}
        for i = 0, 5 do
            tireBurstState[i] = IsVehicleTyreBurst(vehicle, i, false)
        end

        local tireBurstCompletely = {}
        for i = 0, 5 do
            tireBurstCompletely[i] = IsVehicleTyreBurst(vehicle, i, true)
        end

        local windowStatus = {}
        for i = 0, 7 do
            windowStatus[i] = IsVehicleWindowIntact(vehicle, i) == 1
        end

        local doorStatus = {}
        for i = 0, 5 do
            doorStatus[i] = IsVehicleDoorDamaged(vehicle, i) == 1
        end

        local xenonsCustomColor = {}
        local xenonsCustomColorEnabled, x_red, x_green, x_blue = GetVehicleXenonLightsCustomColor(vehicle)
        if xenonsCustomColorEnabled then
            xenonsCustomColor = {x_red, x_green, x_blue}
        end

        local paintType_1, color1, pearlescentColor_1 = GetVehicleModColor_1(vehicle)
        local paintType_2, color2 = GetVehicleModColor_2(vehicle)

        local modBulletProofTires
        if GetVehicleTyresCanBurst(vehicle) then
            modBulletProofTires = false
        else
            modBulletProofTires = true
        end

        return {
            model = GetEntityModel(vehicle),
            plate = ESX.Math.Trim(GetVehicleNumberPlateText(vehicle)),
            plateIndex = GetVehicleNumberPlateTextIndex(vehicle),
            bodyHealth = ESX.Math.Round(GetVehicleBodyHealth(vehicle), 0.1),
            engineHealth = ESX.Math.Round(GetVehicleEngineHealth(vehicle), 0.1),
            tankHealth = ESX.Math.Round(GetVehiclePetrolTankHealth(vehicle), 0.1),
            fuelLevel = ESX.Math.Round(GetVehicleFuelLevel(vehicle), 0.1),
            dirtLevel = ESX.Math.Round(GetVehicleDirtLevel(vehicle), 0.1),
            oilLevel = ESX.Math.Round(GetVehicleOilLevel(vehicle), 0.1),
            color1 = colorPrimary,
            color2 = colorSecondary,
            pearlescentColor = pearlescentColor,
            dashboardColor = GetVehicleDashboardColour(vehicle),
            wheelColor = wheelColor,
            wheels = GetVehicleWheelType(vehicle),
            wheelSize = GetVehicleWheelSize(vehicle),
            wheelWidth = GetVehicleWheelWidth(vehicle),
            tireHealth = tireHealth,
            tireBurstState = tireBurstState,
            tireBurstCompletely = tireBurstCompletely,
            windowTint = GetVehicleWindowTint(vehicle),
            windowStatus = windowStatus,
            doorStatus = doorStatus,
            xenonColor = GetVehicleXenonLightsColour(vehicle),
            neonEnabled = {IsVehicleNeonLightEnabled(vehicle, 0), IsVehicleNeonLightEnabled(vehicle, 1),
                           IsVehicleNeonLightEnabled(vehicle, 2), IsVehicleNeonLightEnabled(vehicle, 3)},
            neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)),
            headlightColor = GetVehicleHeadlightsColour(vehicle),
            interiorColor = GetVehicleInteriorColour(vehicle),
            extras = extras,
            tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)),
            modSpoilers = GetVehicleMod(vehicle, 0),
            modFrontBumper = GetVehicleMod(vehicle, 1),
            modRearBumper = GetVehicleMod(vehicle, 2),
            modSideSkirt = GetVehicleMod(vehicle, 3),
            modExhaust = GetVehicleMod(vehicle, 4),
            modFrame = GetVehicleMod(vehicle, 5),
            modGrille = GetVehicleMod(vehicle, 6),
            modHood = GetVehicleMod(vehicle, 7),
            modFender = GetVehicleMod(vehicle, 8),
            modRightFender = GetVehicleMod(vehicle, 9),
            modRoof = GetVehicleMod(vehicle, 10),
            modEngine = GetVehicleMod(vehicle, 11),
            modBrakes = GetVehicleMod(vehicle, 12),
            modTransmission = GetVehicleMod(vehicle, 13),
            modHorns = GetVehicleMod(vehicle, 14),
            modSuspension = GetVehicleMod(vehicle, 15),
            modArmor = GetVehicleMod(vehicle, 16),
            modKit17 = GetVehicleMod(vehicle, 17),
            modTurbo = IsToggleModOn(vehicle, 18),
            modKit19 = GetVehicleMod(vehicle, 19),
            modSmokeEnabled = IsToggleModOn(vehicle, 20),
            modKit21 = GetVehicleMod(vehicle, 21),
            modXenon = IsToggleModOn(vehicle, 22),
            modFrontWheels = GetVehicleMod(vehicle, 23),
            modBackWheels = GetVehicleMod(vehicle, 24),
            modCustomTiresF = GetVehicleModVariation(vehicle, 23),
            modCustomTiresR = GetVehicleModVariation(vehicle, 24),
            modPlateHolder = GetVehicleMod(vehicle, 25),
            modVanityPlate = GetVehicleMod(vehicle, 26),
            modTrimA = GetVehicleMod(vehicle, 27),
            modOrnaments = GetVehicleMod(vehicle, 28),
            modDashboard = GetVehicleMod(vehicle, 29),
            modDial = GetVehicleMod(vehicle, 30),
            modDoorSpeaker = GetVehicleMod(vehicle, 31),
            modSeats = GetVehicleMod(vehicle, 32),
            modSteeringWheel = GetVehicleMod(vehicle, 33),
            modShifterLeavers = GetVehicleMod(vehicle, 34),
            modAPlate = GetVehicleMod(vehicle, 35),
            modSpeakers = GetVehicleMod(vehicle, 36),
            modTrunk = GetVehicleMod(vehicle, 37),
            modHydrolic = GetVehicleMod(vehicle, 38),
            modEngineBlock = GetVehicleMod(vehicle, 39),
            modAirFilter = GetVehicleMod(vehicle, 40),
            modStruts = GetVehicleMod(vehicle, 41),
            modArchCover = GetVehicleMod(vehicle, 42),
            modAerials = GetVehicleMod(vehicle, 43),
            modTrimB = GetVehicleMod(vehicle, 44),
            modTank = GetVehicleMod(vehicle, 45),
            modWindows = GetVehicleMod(vehicle, 46),
            modKit47 = GetVehicleMod(vehicle, 47),
            modLivery = modLivery,
            modKit49 = GetVehicleMod(vehicle, 49),
            liveryRoof = GetVehicleRoofLivery(vehicle),
            modBulletProofTires = modBulletProofTires,
            paintType1 = paintType_1,
            paintType2 = paintType_2,
            xenonCustomColorEnabled = xenonsCustomColorEnabled,
            xenonCustomColor = xenonsCustomColor
        }
    else
        return
    end
end
```

{% endtab %}

{% tab title="ESX.Game.SetVehicleProperties" %}

```lua
function ESX.Game.SetVehicleProperties(vehicle, props)
    if props.extras then
        for id, enabled in pairs(props.extras) do
            if enabled then
                SetVehicleExtra(vehicle, tonumber(id), 0)
            else
                SetVehicleExtra(vehicle, tonumber(id), 1)
            end
        end
    end

    local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
    local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)

    SetVehicleModKit(vehicle, 0)
    if props.plate then
        SetVehicleNumberPlateText(vehicle, props.plate)
    end
    if props.plateIndex then
        SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex)
    end
    if props.bodyHealth then
        SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0)
    end
    if props.engineHealth then
        SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0)
    end
    if props.tankHealth then
        SetVehiclePetrolTankHealth(vehicle, props.tankHealth)
    end
    if props.fuelLevel then
        SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0)
    end
    if props.dirtLevel then
        SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0)
    end
    if props.oilLevel then
        SetVehicleOilLevel(vehicle, props.oilLevel)
    end
    if props.color1 ~= nil then
        if type(props.color1) == 'number' then
            ClearVehicleCustomPrimaryColour(vehicle)
            SetVehicleModColor_1(vehicle, props.paintType1, props.color1, props.pearlescentColor)
            if type(props.color2) == 'number' then
                SetVehicleColours(vehicle, props.color1, props.color2)
            end
        else
            SetVehicleModColor_1(vehicle, props.paintType1, 0, props.pearlescentColor)
            SetVehicleCustomPrimaryColour(vehicle, props.color1[1], props.color1[2], props.color1[3])
        end
    end

    if props.color2 ~= nil then
        if type(props.color2) == 'number' then
            ClearVehicleCustomSecondaryColour(vehicle)
            SetVehicleModColor_2(vehicle, props.paintType2, props.color2)
            if type(props.color1) == 'number' then
                SetVehicleColours(vehicle, props.color1, props.color2)
            end
            if type(props.color1) ~= 'number' then
                SetVehicleModColor_1(vehicle, props.paintType1, 0, props.pearlescentColor)
            end
        else
            SetVehicleModColor_2(vehicle, props.paintType2, 0)
            SetVehicleCustomSecondaryColour(vehicle, props.color2[1], props.color2[2], props.color2[3])
        end
    end
    if props.pearlescentColor then
        SetVehicleExtraColours(vehicle, props.pearlescentColor, wheelColor)
    end
    if props.interiorColor then
        SetVehicleInteriorColor(vehicle, props.interiorColor)
    end
    if props.dashboardColor then
        SetVehicleDashboardColour(vehicle, props.dashboardColor)
    end
    if props.wheelColor then
        SetVehicleExtraColours(vehicle, props.pearlescentColor or pearlescentColor, props.wheelColor)
    end
    if props.wheels then
        SetVehicleWheelType(vehicle, props.wheels)
    end
    if props.tireHealth then
        for wheelIndex, health in pairs(props.tireHealth) do
            SetVehicleWheelHealth(vehicle, wheelIndex, health)
        end
    end
    if props.tireBurstState then
        for wheelIndex, burstState in pairs(props.tireBurstState) do
            if burstState then
                SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), false, 1000.0)
            end
        end
    end
    if props.tireBurstCompletely then
        for wheelIndex, burstState in pairs(props.tireBurstCompletely) do
            if burstState then
                SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), true, 1000.0)
            end
        end
    end
    if type(props.modBulletProofTires) == 'boolean' then
        if props.modBulletProofTires then
            SetVehicleTyresCanBurst(vehicle, false)
        else
            SetVehicleTyresCanBurst(vehicle, true)
        end
    end
    if props.windowTint then
        SetVehicleWindowTint(vehicle, props.windowTint)
    end
    if props.windowStatus then
        for windowIndex, smashWindow in pairs(props.windowStatus) do
            if not smashWindow then
                SmashVehicleWindow(vehicle, windowIndex)
            end
        end
    end
    if props.doorStatus then
        for doorIndex, breakDoor in pairs(props.doorStatus) do
            if breakDoor then
                SetVehicleDoorBroken(vehicle, tonumber(doorIndex), true)
            end
        end
    end
    if props.neonEnabled then
        SetVehicleNeonLightEnabled(vehicle, 0, props.neonEnabled[1])
        SetVehicleNeonLightEnabled(vehicle, 1, props.neonEnabled[2])
        SetVehicleNeonLightEnabled(vehicle, 2, props.neonEnabled[3])
        SetVehicleNeonLightEnabled(vehicle, 3, props.neonEnabled[4])
    end
    if props.neonColor then
        SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3])
    end
    if props.headlightColor then
        SetVehicleHeadlightsColour(vehicle, props.headlightColor)
    end
    if props.interiorColor then
        SetVehicleInteriorColour(vehicle, props.interiorColor)
    end
    if props.wheelSize then
        SetVehicleWheelSize(vehicle, props.wheelSize)
    end
    if props.wheelWidth then
        SetVehicleWheelWidth(vehicle, props.wheelWidth)
    end
    if props.tyreSmokeColor then
        SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3])
    end
    if props.modSpoilers then
        SetVehicleMod(vehicle, 0, props.modSpoilers, false)
    end
    if props.modFrontBumper then
        SetVehicleMod(vehicle, 1, props.modFrontBumper, false)
    end
    if props.modRearBumper then
        SetVehicleMod(vehicle, 2, props.modRearBumper, false)
    end
    if props.modSideSkirt then
        SetVehicleMod(vehicle, 3, props.modSideSkirt, false)
    end
    if props.modExhaust then
        SetVehicleMod(vehicle, 4, props.modExhaust, false)
    end
    if props.modFrame then
        SetVehicleMod(vehicle, 5, props.modFrame, false)
    end
    if props.modGrille then
        SetVehicleMod(vehicle, 6, props.modGrille, false)
    end
    if props.modHood then
        SetVehicleMod(vehicle, 7, props.modHood, false)
    end
    if props.modFender then
        SetVehicleMod(vehicle, 8, props.modFender, false)
    end
    if props.modRightFender then
        SetVehicleMod(vehicle, 9, props.modRightFender, false)
    end
    if props.modRoof then
        SetVehicleMod(vehicle, 10, props.modRoof, false)
    end
    if props.modEngine then
        SetVehicleMod(vehicle, 11, props.modEngine, false)
    end
    if props.modBrakes then
        SetVehicleMod(vehicle, 12, props.modBrakes, false)
    end
    if props.modTransmission then
        SetVehicleMod(vehicle, 13, props.modTransmission, false)
    end
    if props.modHorns then
        SetVehicleMod(vehicle, 14, props.modHorns, false)
    end
    if props.modSuspension then
        SetVehicleMod(vehicle, 15, props.modSuspension, false)
    end
    if props.modArmor then
        SetVehicleMod(vehicle, 16, props.modArmor, false)
    end
    if props.modKit17 then
        SetVehicleMod(vehicle, 17, props.modKit17, false)
    end
    if type(props.modTurbo) ~= "nil" then
        ToggleVehicleMod(vehicle, 18, props.modTurbo)
    end
    if props.modKit19 then
        SetVehicleMod(vehicle, 19, props.modKit19, false)
    end
    if type(props.modSmokeEnabled) ~= 'nil' then
        ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled and true or false)
    end
    if props.modKit21 then
        SetVehicleMod(vehicle, 21, props.modKit21, false)
    end
    if type(props.modXenon) ~= 'nil' then
        ToggleVehicleMod(vehicle, 22, props.modXenon)
    end
    if props.xenonCustomColorEnabled and props.xenonCustomColor then
        SetVehicleXenonLightsCustomColor(vehicle, props.xenonCustomColor[1], props.xenonCustomColor[2],
            props.xenonCustomColor[3])
    elseif props.xenonColor then
        SetVehicleXenonLightsColor(vehicle, props.xenonColor)
    end
    if props.modFrontWheels then
        SetVehicleMod(vehicle, 23, props.modFrontWheels, false)
    end
    if props.modBackWheels then
        SetVehicleMod(vehicle, 24, props.modBackWheels, false)
    end
    if props.modCustomTiresF then
        SetVehicleMod(vehicle, 23, props.modFrontWheels, props.modCustomTiresF)
    end
    if props.modCustomTiresR then
        SetVehicleMod(vehicle, 24, props.modBackWheels, props.modCustomTiresR)
    end
    if props.modPlateHolder then
        SetVehicleMod(vehicle, 25, props.modPlateHolder, false)
    end
    if props.modVanityPlate then
        SetVehicleMod(vehicle, 26, props.modVanityPlate, false)
    end
    if props.modTrimA then
        SetVehicleMod(vehicle, 27, props.modTrimA, false)
    end
    if props.modOrnaments then
        SetVehicleMod(vehicle, 28, props.modOrnaments, false)
    end
    if props.modDashboard then
        SetVehicleMod(vehicle, 29, props.modDashboard, false)
    end
    if props.modDial then
        SetVehicleMod(vehicle, 30, props.modDial, false)
    end
    if props.modDoorSpeaker then
        SetVehicleMod(vehicle, 31, props.modDoorSpeaker, false)
    end
    if props.modSeats then
        SetVehicleMod(vehicle, 32, props.modSeats, false)
    end
    if props.modSteeringWheel then
        SetVehicleMod(vehicle, 33, props.modSteeringWheel, false)
    end
    if props.modShifterLeavers then
        SetVehicleMod(vehicle, 34, props.modShifterLeavers, false)
    end
    if props.modAPlate then
        SetVehicleMod(vehicle, 35, props.modAPlate, false)
    end
    if props.modSpeakers then
        SetVehicleMod(vehicle, 36, props.modSpeakers, false)
    end
    if props.modTrunk then
        SetVehicleMod(vehicle, 37, props.modTrunk, false)
    end
    if props.modHydrolic then
        SetVehicleMod(vehicle, 38, props.modHydrolic, false)
    end
    if props.modEngineBlock then
        SetVehicleMod(vehicle, 39, props.modEngineBlock, false)
    end
    if props.modAirFilter then
        SetVehicleMod(vehicle, 40, props.modAirFilter, false)
    end
    if props.modStruts then
        SetVehicleMod(vehicle, 41, props.modStruts, false)
    end
    if props.modArchCover then
        SetVehicleMod(vehicle, 42, props.modArchCover, false)
    end
    if props.modAerials then
        SetVehicleMod(vehicle, 43, props.modAerials, false)
    end
    if props.modTrimB then
        SetVehicleMod(vehicle, 44, props.modTrimB, false)
    end
    if props.modTank then
        SetVehicleMod(vehicle, 45, props.modTank, false)
    end
    if props.modWindows then
        SetVehicleMod(vehicle, 46, props.modWindows, false)
    end
    if props.modKit47 then
        SetVehicleMod(vehicle, 47, props.modKit47, false)
    end
    if props.modLivery then
        SetVehicleMod(vehicle, 48, props.modLivery, false)
        SetVehicleLivery(vehicle, props.modLivery)
    end
    if props.modKit49 then
        SetVehicleMod(vehicle, 49, props.modKit49, false)
    end
    if props.liveryRoof then
        SetVehicleRoofLivery(vehicle, props.liveryRoof)
    end
end
```

{% endtab %}
{% endtabs %}

### QBCore

Navigate to **qb-core/client/functions.lua** and entirely replace the following functions:

{% tabs %}
{% tab title="QBCore.Functions.GetVehicleProperties" %}

```lua
function QBCore.Functions.GetVehicleProperties(vehicle)
    if DoesEntityExist(vehicle) then
        local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)

        local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
        if GetIsVehiclePrimaryColourCustom(vehicle) then
            local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
            colorPrimary = {r, g, b}
        end

        if GetIsVehicleSecondaryColourCustom(vehicle) then
            local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
            colorSecondary = {r, g, b}
        end

        local extras = {}
        for extraId = 0, 12 do
            if DoesExtraExist(vehicle, extraId) then
                local state = IsVehicleExtraTurnedOn(vehicle, extraId) == 1
                extras[tostring(extraId)] = state
            end
        end

        local modLivery = GetVehicleMod(vehicle, 48)
        if GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) ~= 0 then
            modLivery = GetVehicleLivery(vehicle)
        end

        local tireHealth = {}
        for i = 0, 3 do
            tireHealth[i] = GetVehicleWheelHealth(vehicle, i)
        end

        local tireBurstState = {}
        for i = 0, 5 do
            tireBurstState[i] = IsVehicleTyreBurst(vehicle, i, false)
        end

        local tireBurstCompletely = {}
        for i = 0, 5 do
            tireBurstCompletely[i] = IsVehicleTyreBurst(vehicle, i, true)
        end

        local windowStatus = {}
        for i = 0, 7 do
            windowStatus[i] = IsVehicleWindowIntact(vehicle, i) == 1
        end

        local doorStatus = {}
        for i = 0, 5 do
            doorStatus[i] = IsVehicleDoorDamaged(vehicle, i) == 1
        end

        local xenonsCustomColor = {}
        local xenonsCustomColorEnabled, x_red, x_green, x_blue = GetVehicleXenonLightsCustomColor(vehicle)
        if xenonsCustomColorEnabled then
            xenonsCustomColor = {x_red, x_green, x_blue}
        end

        local paintType_1, color1, pearlescentColor_1 = GetVehicleModColor_1(vehicle)
        local paintType_2, color2 = GetVehicleModColor_2(vehicle)

        local modBulletProofTires
        if GetVehicleTyresCanBurst(vehicle) then
            modBulletProofTires = false
        else
            modBulletProofTires = true
        end

        return {
            model = GetEntityModel(vehicle),
            plate = QBCore.Functions.GetPlate(vehicle),
            plateIndex = GetVehicleNumberPlateTextIndex(vehicle),
            bodyHealth = QBCore.Shared.Round(GetVehicleBodyHealth(vehicle), 0.1),
            engineHealth = QBCore.Shared.Round(GetVehicleEngineHealth(vehicle), 0.1),
            tankHealth = QBCore.Shared.Round(GetVehiclePetrolTankHealth(vehicle), 0.1),
            fuelLevel = QBCore.Shared.Round(GetVehicleFuelLevel(vehicle), 0.1),
            dirtLevel = QBCore.Shared.Round(GetVehicleDirtLevel(vehicle), 0.1),
            oilLevel = QBCore.Shared.Round(GetVehicleOilLevel(vehicle), 0.1),
            color1 = colorPrimary,
            color2 = colorSecondary,
            pearlescentColor = pearlescentColor,
            dashboardColor = GetVehicleDashboardColour(vehicle),
            wheelColor = wheelColor,
            wheels = GetVehicleWheelType(vehicle),
            wheelSize = GetVehicleWheelSize(vehicle),
            wheelWidth = GetVehicleWheelWidth(vehicle),
            tireHealth = tireHealth,
            tireBurstState = tireBurstState,
            tireBurstCompletely = tireBurstCompletely,
            windowTint = GetVehicleWindowTint(vehicle),
            windowStatus = windowStatus,
            doorStatus = doorStatus,
            xenonColor = GetVehicleXenonLightsColour(vehicle),
            neonEnabled = {IsVehicleNeonLightEnabled(vehicle, 0), IsVehicleNeonLightEnabled(vehicle, 1),
                           IsVehicleNeonLightEnabled(vehicle, 2), IsVehicleNeonLightEnabled(vehicle, 3)},
            neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)),
            headlightColor = GetVehicleHeadlightsColour(vehicle),
            interiorColor = GetVehicleInteriorColour(vehicle),
            extras = extras,
            tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)),
            modSpoilers = GetVehicleMod(vehicle, 0),
            modFrontBumper = GetVehicleMod(vehicle, 1),
            modRearBumper = GetVehicleMod(vehicle, 2),
            modSideSkirt = GetVehicleMod(vehicle, 3),
            modExhaust = GetVehicleMod(vehicle, 4),
            modFrame = GetVehicleMod(vehicle, 5),
            modGrille = GetVehicleMod(vehicle, 6),
            modHood = GetVehicleMod(vehicle, 7),
            modFender = GetVehicleMod(vehicle, 8),
            modRightFender = GetVehicleMod(vehicle, 9),
            modRoof = GetVehicleMod(vehicle, 10),
            modEngine = GetVehicleMod(vehicle, 11),
            modBrakes = GetVehicleMod(vehicle, 12),
            modTransmission = GetVehicleMod(vehicle, 13),
            modHorns = GetVehicleMod(vehicle, 14),
            modSuspension = GetVehicleMod(vehicle, 15),
            modArmor = GetVehicleMod(vehicle, 16),
            modKit17 = GetVehicleMod(vehicle, 17),
            modTurbo = IsToggleModOn(vehicle, 18),
            modKit19 = GetVehicleMod(vehicle, 19),
            modSmokeEnabled = IsToggleModOn(vehicle, 20),
            modKit21 = GetVehicleMod(vehicle, 21),
            modXenon = IsToggleModOn(vehicle, 22),
            modFrontWheels = GetVehicleMod(vehicle, 23),
            modBackWheels = GetVehicleMod(vehicle, 24),
            modCustomTiresF = GetVehicleModVariation(vehicle, 23),
            modCustomTiresR = GetVehicleModVariation(vehicle, 24),
            modPlateHolder = GetVehicleMod(vehicle, 25),
            modVanityPlate = GetVehicleMod(vehicle, 26),
            modTrimA = GetVehicleMod(vehicle, 27),
            modOrnaments = GetVehicleMod(vehicle, 28),
            modDashboard = GetVehicleMod(vehicle, 29),
            modDial = GetVehicleMod(vehicle, 30),
            modDoorSpeaker = GetVehicleMod(vehicle, 31),
            modSeats = GetVehicleMod(vehicle, 32),
            modSteeringWheel = GetVehicleMod(vehicle, 33),
            modShifterLeavers = GetVehicleMod(vehicle, 34),
            modAPlate = GetVehicleMod(vehicle, 35),
            modSpeakers = GetVehicleMod(vehicle, 36),
            modTrunk = GetVehicleMod(vehicle, 37),
            modHydrolic = GetVehicleMod(vehicle, 38),
            modEngineBlock = GetVehicleMod(vehicle, 39),
            modAirFilter = GetVehicleMod(vehicle, 40),
            modStruts = GetVehicleMod(vehicle, 41),
            modArchCover = GetVehicleMod(vehicle, 42),
            modAerials = GetVehicleMod(vehicle, 43),
            modTrimB = GetVehicleMod(vehicle, 44),
            modTank = GetVehicleMod(vehicle, 45),
            modWindows = GetVehicleMod(vehicle, 46),
            modKit47 = GetVehicleMod(vehicle, 47),
            modLivery = modLivery,
            modKit49 = GetVehicleMod(vehicle, 49),
            liveryRoof = GetVehicleRoofLivery(vehicle),
            modBulletProofTires = modBulletProofTires,
            paintType1 = paintType_1,
            paintType2 = paintType_2,
            xenonCustomColorEnabled = xenonsCustomColorEnabled,
            xenonCustomColor = xenonsCustomColor
        }
    else
        return
    end
end
```

{% endtab %}

{% tab title="QBCore.Functions.SetVehicleProperties" %}

```lua
function QBCore.Functions.SetVehicleProperties(vehicle, props)
    if props.extras then
        for id, enabled in pairs(props.extras) do
            if enabled then
                SetVehicleExtra(vehicle, tonumber(id), 0)
            else
                SetVehicleExtra(vehicle, tonumber(id), 1)
            end
        end
    end

    local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
    local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)

    SetVehicleModKit(vehicle, 0)
    if props.plate then
        SetVehicleNumberPlateText(vehicle, props.plate)
    end
    if props.plateIndex then
        SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex)
    end
    if props.bodyHealth then
        SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0)
    end
    if props.engineHealth then
        SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0)
    end
    if props.tankHealth then
        SetVehiclePetrolTankHealth(vehicle, props.tankHealth)
    end
    if props.fuelLevel then
        SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0)
    end
    if props.dirtLevel then
        SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0)
    end
    if props.oilLevel then
        SetVehicleOilLevel(vehicle, props.oilLevel)
    end
    if props.color1 ~= nil then
    if type(props.color1) == 'number' then
        ClearVehicleCustomPrimaryColour(vehicle)
        SetVehicleModColor_1(vehicle, props.paintType1, props.color1, props.pearlescentColor)
        if type(props.color2) == 'number' then
            SetVehicleColours(vehicle, props.color1, props.color2)
        end
    else
        SetVehicleModColor_1(vehicle, props.paintType1, 0, props.pearlescentColor)
        SetVehicleCustomPrimaryColour(vehicle, props.color1[1], props.color1[2], props.color1[3])
        end
    end

    if props.color2 ~= nil then
    if type(props.color2) == 'number' then
        ClearVehicleCustomSecondaryColour(vehicle)
        SetVehicleModColor_2(vehicle, props.paintType2, props.color2)
        if type(props.color1) == 'number' then
            SetVehicleColours(vehicle, props.color1, props.color2)
        end
        if type(props.color1) ~= 'number' then
            SetVehicleModColor_1(vehicle, props.paintType1, 0, props.pearlescentColor)
        end
    else
        SetVehicleModColor_2(vehicle, props.paintType2, 0)
        SetVehicleCustomSecondaryColour(vehicle, props.color2[1], props.color2[2], props.color2[3])
        end
    end
    if props.pearlescentColor then
        SetVehicleExtraColours(vehicle, props.pearlescentColor, wheelColor)
    end
    if props.interiorColor then
        SetVehicleInteriorColor(vehicle, props.interiorColor)
    end
    if props.dashboardColor then
        SetVehicleDashboardColour(vehicle, props.dashboardColor)
    end
    if props.wheelColor then
        SetVehicleExtraColours(vehicle, props.pearlescentColor or pearlescentColor, props.wheelColor)
    end
    if props.wheels then
        SetVehicleWheelType(vehicle, props.wheels)
    end
    if props.tireHealth then
        for wheelIndex, health in pairs(props.tireHealth) do
            SetVehicleWheelHealth(vehicle, wheelIndex, health)
        end
    end
    if props.tireBurstState then
        for wheelIndex, burstState in pairs(props.tireBurstState) do
            if burstState then
                SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), false, 1000.0)
            end
        end
    end
    if props.tireBurstCompletely then
        for wheelIndex, burstState in pairs(props.tireBurstCompletely) do
            if burstState then
                SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), true, 1000.0)
            end
        end
    end
    if type(props.modBulletProofTires) == 'boolean' then
        if props.modBulletProofTires then
            SetVehicleTyresCanBurst(vehicle, false)
        else
            SetVehicleTyresCanBurst(vehicle, true)
        end
    end
    if props.windowTint then
        SetVehicleWindowTint(vehicle, props.windowTint)
    end
    if props.windowStatus then
        for windowIndex, smashWindow in pairs(props.windowStatus) do
            if not smashWindow then
                SmashVehicleWindow(vehicle, windowIndex)
            end
        end
    end
    if props.doorStatus then
        for doorIndex, breakDoor in pairs(props.doorStatus) do
            if breakDoor then
                SetVehicleDoorBroken(vehicle, tonumber(doorIndex), true)
            end
        end
    end
    if props.neonEnabled then
        SetVehicleNeonLightEnabled(vehicle, 0, props.neonEnabled[1])
        SetVehicleNeonLightEnabled(vehicle, 1, props.neonEnabled[2])
        SetVehicleNeonLightEnabled(vehicle, 2, props.neonEnabled[3])
        SetVehicleNeonLightEnabled(vehicle, 3, props.neonEnabled[4])
    end
    if props.neonColor then
        SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3])
    end
    if props.headlightColor then
        SetVehicleHeadlightsColour(vehicle, props.headlightColor)
    end
    if props.interiorColor then
        SetVehicleInteriorColour(vehicle, props.interiorColor)
    end
    if props.wheelSize then
        SetVehicleWheelSize(vehicle, props.wheelSize)
    end
    if props.wheelWidth then
        SetVehicleWheelWidth(vehicle, props.wheelWidth)
    end
    if props.tyreSmokeColor then
        SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3])
    end
    if props.modSpoilers then
        SetVehicleMod(vehicle, 0, props.modSpoilers, false)
    end
    if props.modFrontBumper then
        SetVehicleMod(vehicle, 1, props.modFrontBumper, false)
    end
    if props.modRearBumper then
        SetVehicleMod(vehicle, 2, props.modRearBumper, false)
    end
    if props.modSideSkirt then
        SetVehicleMod(vehicle, 3, props.modSideSkirt, false)
    end
    if props.modExhaust then
        SetVehicleMod(vehicle, 4, props.modExhaust, false)
    end
    if props.modFrame then
        SetVehicleMod(vehicle, 5, props.modFrame, false)
    end
    if props.modGrille then
        SetVehicleMod(vehicle, 6, props.modGrille, false)
    end
    if props.modHood then
        SetVehicleMod(vehicle, 7, props.modHood, false)
    end
    if props.modFender then
        SetVehicleMod(vehicle, 8, props.modFender, false)
    end
    if props.modRightFender then
        SetVehicleMod(vehicle, 9, props.modRightFender, false)
    end
    if props.modRoof then
        SetVehicleMod(vehicle, 10, props.modRoof, false)
    end
    if props.modEngine then
        SetVehicleMod(vehicle, 11, props.modEngine, false)
    end
    if props.modBrakes then
        SetVehicleMod(vehicle, 12, props.modBrakes, false)
    end
    if props.modTransmission then
        SetVehicleMod(vehicle, 13, props.modTransmission, false)
    end
    if props.modHorns then
        SetVehicleMod(vehicle, 14, props.modHorns, false)
    end
    if props.modSuspension then
        SetVehicleMod(vehicle, 15, props.modSuspension, false)
    end
    if props.modArmor then
        SetVehicleMod(vehicle, 16, props.modArmor, false)
    end
    if props.modKit17 then
        SetVehicleMod(vehicle, 17, props.modKit17, false)
    end
    if type(props.modTurbo) ~= "nil" then
        ToggleVehicleMod(vehicle, 18, props.modTurbo)
    end
    if props.modKit19 then
        SetVehicleMod(vehicle, 19, props.modKit19, false)
    end
    if type(props.modSmokeEnabled) ~= 'nil' then
        ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled and true or false)
    end
    if props.modKit21 then
        SetVehicleMod(vehicle, 21, props.modKit21, false)
    end
    if type(props.modXenon) ~= 'nil' then
        ToggleVehicleMod(vehicle, 22, props.modXenon)
    end
    if props.xenonCustomColorEnabled and props.xenonCustomColor then
        SetVehicleXenonLightsCustomColor(vehicle, props.xenonCustomColor[1], props.xenonCustomColor[2],
            props.xenonCustomColor[3])
    elseif props.xenonColor then
        SetVehicleXenonLightsColor(vehicle, props.xenonColor)
    end
    if props.modFrontWheels then
        SetVehicleMod(vehicle, 23, props.modFrontWheels, false)
    end
    if props.modBackWheels then
        SetVehicleMod(vehicle, 24, props.modBackWheels, false)
    end
    if props.modCustomTiresF then
        SetVehicleMod(vehicle, 23, props.modFrontWheels, props.modCustomTiresF)
    end
    if props.modCustomTiresR then
        SetVehicleMod(vehicle, 24, props.modBackWheels, props.modCustomTiresR)
    end
    if props.modPlateHolder then
        SetVehicleMod(vehicle, 25, props.modPlateHolder, false)
    end
    if props.modVanityPlate then
        SetVehicleMod(vehicle, 26, props.modVanityPlate, false)
    end
    if props.modTrimA then
        SetVehicleMod(vehicle, 27, props.modTrimA, false)
    end
    if props.modOrnaments then
        SetVehicleMod(vehicle, 28, props.modOrnaments, false)
    end
    if props.modDashboard then
        SetVehicleMod(vehicle, 29, props.modDashboard, false)
    end
    if props.modDial then
        SetVehicleMod(vehicle, 30, props.modDial, false)
    end
    if props.modDoorSpeaker then
        SetVehicleMod(vehicle, 31, props.modDoorSpeaker, false)
    end
    if props.modSeats then
        SetVehicleMod(vehicle, 32, props.modSeats, false)
    end
    if props.modSteeringWheel then
        SetVehicleMod(vehicle, 33, props.modSteeringWheel, false)
    end
    if props.modShifterLeavers then
        SetVehicleMod(vehicle, 34, props.modShifterLeavers, false)
    end
    if props.modAPlate then
        SetVehicleMod(vehicle, 35, props.modAPlate, false)
    end
    if props.modSpeakers then
        SetVehicleMod(vehicle, 36, props.modSpeakers, false)
    end
    if props.modTrunk then
        SetVehicleMod(vehicle, 37, props.modTrunk, false)
    end
    if props.modHydrolic then
        SetVehicleMod(vehicle, 38, props.modHydrolic, false)
    end
    if props.modEngineBlock then
        SetVehicleMod(vehicle, 39, props.modEngineBlock, false)
    end
    if props.modAirFilter then
        SetVehicleMod(vehicle, 40, props.modAirFilter, false)
    end
    if props.modStruts then
        SetVehicleMod(vehicle, 41, props.modStruts, false)
    end
    if props.modArchCover then
        SetVehicleMod(vehicle, 42, props.modArchCover, false)
    end
    if props.modAerials then
        SetVehicleMod(vehicle, 43, props.modAerials, false)
    end
    if props.modTrimB then
        SetVehicleMod(vehicle, 44, props.modTrimB, false)
    end
    if props.modTank then
        SetVehicleMod(vehicle, 45, props.modTank, false)
    end
    if props.modWindows then
        SetVehicleMod(vehicle, 46, props.modWindows, false)
    end
    if props.modKit47 then
        SetVehicleMod(vehicle, 47, props.modKit47, false)
    end
    if props.modLivery then
        SetVehicleMod(vehicle, 48, props.modLivery, false)
        SetVehicleLivery(vehicle, props.modLivery)
    end
    if props.modKit49 then
        SetVehicleMod(vehicle, 49, props.modKit49, false)
    end
    if props.liveryRoof then
        SetVehicleRoofLivery(vehicle, props.liveryRoof)
    end
end
```

{% endtab %}
{% endtabs %}

### Set the Discord Webhook URL (to enable logs)

Navigate to the `sv_utils.lua` file and paste the webhook URL in the line 3.

[How to create a Discord Webhook URL](https://ahsda89sgdh18923asd.gitbook.io/main/others/discord-webhook)

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config = {}

Config.Debug = false -- May print some debug messages in the console

Config.DeleteVehicleOnPlayerLeave = true -- If true, it'll delete the vehicle when the player leaves the server and has the menu open

Config.Locale = 'en' -- en / pt / gr / fr / de / es

Config.EventPrefix = 'okokTuning'

Config.UISounds = true -- Enable/Disable UI Sounds

Config.Currency = {
      -- Menu Currency, Supports ISO codes only
      locale = 'en-US', -- https://www.localeplanet.com/icu/
      currency = 'USD', -- https://www.localeplanet.com/icu/currency.html
}

Config.SocietyPay = true                -- If true, it'll use the society money to pay the bills

Config.UseMoneyAccount = "bank"         -- What account to use when paying bills

Config.OpenAnywhere = false             -- If true, you can open the menu anywhere (use event 'okokTuning:openTuningMenu')
Config.AllowTuneWhenDamaged = true      -- If true, it'll allow you to tune the vehicle even if it's damaged
Config.RepairMenu = true                -- If true, it'll use the repair menu
Config.RepairCommand = 'trepair'        -- Repair command | Ace Permission: okokTuning.repair
Config.AdminCommand = 'tuning'          -- Admin command to open the menu | Ace Permission: okokTuning.admin
Config.VehicleStatsCommand = 'vehstats' -- Vehicle stats command (vehicle model, engine, transmission, etc)

Config.JobsThatCanUseRepairCommand = {  -- Jobs that can use the repair command
      'mechanic',
}

Config.AddonAccount = true        -- If set to true it will use the qb-management resource, if set to false it will use the okokBanking database tables

Config.UseOkOkTextUI = true       -- If true, you need to have okokTextUI installed and configured.
Config.UseOkokNotify = true       -- If true, you need to have okokNotify installed and configured.
Config.UseOkokBanking = true      -- If true, you need to have okokBanking installed and configured.
Config.SocietyHasPrefix = false   -- If true, it'll use the society prefix for the transactions (society_job)
Config.UseOkokVehicleShop = false -- If true, it'll use the price of the vehicles in okokVehicleShop.

Config.PricingMethod = "fixed"             -- "fixed" = Fixed price per category | "percentage" = Percentage of the base price
Config.PricingPercentage = 0.05            -- Decimal Percentage of the Vehicles Price Impact on the Option price

Config.RepairPrice = 500.0                 -- Price to repair the vehicle
Config.RepairPriceDependsOnDamage = true   -- If true, RepairPrice will be the max price depending on the damage.

Config.ShowRecommendedInvoicePrice = false -- If true, it'll show the recommended invoice price
Config.PercentageAbovePrice = 50           -- Percentage above the price to show as recommended

Config.RemovableMods = { --[[ Remove Mods, if true, the mod will be removed from the vehicle. ]]
      BulletProofTires = false,
}

Config.OpenMenuKey = 38 -- E
Config.FreecamKey = "q"

Config.UseInspectCameras = true    -- If true, you can inspect the vehicle with the cameras
Config.CameraTransitionTime = 0.75 -- Time in seconds to change the camera

Config.InspectVehicleCameras = {
      ['cars'] = {
            { showButton = true,    bone = 'wheel_lr',      displayName = 'Left Wheel',         cameraOffset = vector3(-2.0, -1.2, 0.0),  openDoors = {},               mods = {'wheels'} },
            { showButton = true,    bone = 'window_rf',     displayName = 'Right Window',       cameraOffset = vector3(1.0, 1.0, 0.0),    openDoors = {},               mods = {'modWindows', 'windowTint'} },
            { showButton = true,    bone = 'headlight_l',   displayName = 'Headlight',          cameraOffset = vector3(-1.0, 2.0, 0.0),   openDoors = {},               mods = {'modArchCover', 'modAerials'} },
            { showButton = false,   bone = 'wheel_lf',      displayName = 'Left Bumper',        cameraOffset = vector3(-2.0, 1.0, 1.0),   openDoors = {},               mods = {'modFender'} },
            { showButton = false,   bone = 'exhaust',       displayName = 'Exhaust',            cameraOffset = vector3(-0.5, -2.0, 0.0),  openDoors = {},               mods = {'modExhaust'} },
            { showButton = false,   bone = 'windscreen_r',  displayName = 'Back Window',        cameraOffset = vector3(-1.0, -3.5, 1.5),  openDoors = {},               mods = {'modSpoilers'} },
            { showButton = false,   bone = 'windscreen_r',  displayName = 'Roll Cage',          cameraOffset = vector3(0.0, 1.8, 0.0),    openDoors = {},               mods = {'modFrame'} },
            { showButton = false,   bone = 'windscreen',    displayName = 'Interior',           cameraOffset = vector3(0.2, -1.0, 0.0),   openDoors = {},               mods = {'interior', 'dashboard', 'modDashboard'} },
            { showButton = false,   bone = 'windscreen',    displayName = 'Hood',               cameraOffset = vector3(0.0, 3.0, 1.0),    openDoors = {},               mods = {'modHood'} },
            { showButton = false,   bone = 'windscreen',    displayName = 'Motor Changes',      cameraOffset = vector3(0.0, 3.0, 1.0),    openDoors = {4},              mods = {'modEngineBlock', 'modAirFilter', 'modStruts'} },
            { showButton = false,   bone = 'windscreen',    displayName = 'Seats',              cameraOffset = vector3(0.0, 1.0, 0.2),    openDoors = {},               mods = {'modSeats'} },
            { showButton = false,   bone = 'dials',         displayName = 'Colors',             cameraOffset = vector3(-3.0, 5.0, 2.5),   openDoors = {},               mods = {'respray', 'PrimaryColor', 'SecondaryColor', 'pearlescent', 'modLivery'} },
            { showButton = false,   bone = 'neon_l',        displayName = 'Side skirt',         cameraOffset = vector3(-2.0, -1.0, 0.3),  openDoors = {},               mods = {'modSideSkirt'} },
            { showButton = false,   bone = 'neon_f',        displayName = 'Vehicle Front',      cameraOffset = vector3(0.0, 2.0, 1.0),    openDoors = {},               mods = {'modGrille', 'FrontNeon', 'modFrontBumper', 'modXenon', 'modVanityPlate'} },
            { showButton = false,   bone = 'neon_b',        displayName = 'Vehicle Back',       cameraOffset = vector3(0.0, -2.0, 1.0),   openDoors = {},               mods = {'plateIndex', 'BackNeon', 'modRearBumper'} },
            { showButton = false,   bone = 'neon_r',        displayName = 'Right Neon',         cameraOffset = vector3(2.0, 0.0, 1.0),    openDoors = {},               mods = {'RightNeon'} },
            { showButton = false,   bone = 'neon_l',        displayName = 'Left Neon',          cameraOffset = vector3(-2.0, 0.0, 1.0),   openDoors = {},               mods = {'LeftNeon'} },
            { showButton = false,   bone = 'interiorlight', displayName = 'Vehicle Roof',       cameraOffset = vector3(0.0, 2.0, 1.0),    openDoors = {},               mods = {'modRoof', 'modTrimB', 'modTrimA'} },
            { showButton = false,   bone = 'dashglow',      displayName = 'Steering wheel',     cameraOffset = vector3(0.0, -0.5, -0.1),  openDoors = {},               mods = {'modSteeringWheel'} },
            { showButton = false,   bone = 'door_pside_f',  displayName = 'Interior Door',      cameraOffset = vector3(-1.0, -1.0, 0.2),  openDoors = {--[[ 0, 1 ]]},   mods = {'modDoorSpeaker'} },
      },
      ['motorcycles'] = {
            { showButton = true,    bone = 'wheel_lr',      displayName = 'Rear Wheel',         cameraOffset = vector3(-2.0, -1.0, 0.0),  openDoors = {},               mods = {'backWheel', 'wheels'} },
            { showButton = true,    bone = 'wheel_lf',      displayName = 'Front Wheel',        cameraOffset = vector3(-2.0, 1.0, 0.0),   openDoors = {},               mods = {'frontWheel'} },
            { showButton = true,    bone = 'engine',        displayName = 'Engine',             cameraOffset = vector3(-1.0, 0.5, 0.0),   openDoors = {},               mods = {'modEngineBlock', 'modAirFilter'} },
            { showButton = false,   bone = 'wheel_lf',      displayName = 'Front Bumper',       cameraOffset = vector3(-1.5, 0.0, 0.5),   openDoors = {},               mods = {'modFrontBumper'} },
            { showButton = false,   bone = 'wheel_lr',      displayName = 'Rear Bumper',        cameraOffset = vector3(-1.5, 0.0, 0.5),   openDoors = {},               mods = {'modRearBumper'} },
            { showButton = false,   bone = 'engine',        displayName = 'Side Skirt',         cameraOffset = vector3(-1.5, 1.0, 0.0),   openDoors = {},               mods = {'modSideSkirt'} },
            { showButton = false,   bone = 'exhaust',       displayName = 'Exhaust',            cameraOffset = vector3(1.5, -1.0, 0.5),   openDoors = {},               mods = {'modExhaust'} },
            { showButton = false,   bone = 'taillight_r',   displayName = 'Plate',              cameraOffset = vector3(0.3, -1.5, 0.0),   openDoors = {},               mods = {'plateIndex'} },
            { showButton = false,   bone = 'taillight_l',   displayName = 'Plate',              cameraOffset = vector3(0.3, -1.5, 0.0),   openDoors = {},               mods = {'plateIndex'} },
            { showButton = false,   bone = 'headlight_l',   displayName = 'Headlight',          cameraOffset = vector3(0.0, 2.0, 0.0),    openDoors = {},               mods = {'modXenon'} },
            { showButton = false,   bone = 'engine',        displayName = 'Colors',             cameraOffset = vector3(-3.0, 3.0, 1.5),   openDoors = {},               mods = {'respray', 'PrimaryColor', 'SecondaryColor', 'pearlescent', 'modLivery'} },
            { showButton = false,   bone = 'engine',        displayName = 'Whole Bike',         cameraOffset = vector3(-2.0, 1.0, 1.0),   openDoors = {},               mods = {'modAerials', 'modTrimB', 'modRoof', 'modFrame', 'modHood', 'modFender', 'modRightFender', 'modTank'} },
            { showButton = false,   bone = 'engine',        displayName = 'Seat',               cameraOffset = vector3(-2.0, -1.0, 1.0),  openDoors = {},               mods = {'modSeats'} },
            { showButton = false,   bone = 'engine',        displayName = 'Spoilers',           cameraOffset = vector3(-2.0, 2.0, 1.0),   openDoors = {},               mods = {'modSpoilers'} },
      }
}


--[[
      Inspect Vehicle Cameras:

      Bones: https://pastebin.com/D7JMnX1g
      Make sure you use the vehicle bones, some may not work


      List of mods:

      FrontNeon
      BackNeon
      RightNeon
      LeftNeon
      modEngine
      modBrakes
      modTransmission
      modSuspension
      modArmor
      modSpoilers
      modFrontBumper
      modRearBumper
      modSideSkirt
      modExhaust
      modFrame
      modGrille
      modHood
      modFender
      modRightFender
      modRoof
      modVanityPlate
      modTrimA
      modOrnaments
      modDashboard
      modDial
      modDoorSpeaker
      modSeats
      modSteeringWheel
      modShifterLeavers
      modAPlate
      modSpeakers
      modTrunk
      modHydrolic
      modEngineBlock
      modAirFilter
      modStruts
      modArchCover
      modAerials
      modTrimB
      modTank
      modWindows
      modLivery
      modHorns
      modFrame
      windowTint
      wheels
      plateIndex
      neons
      modXenon
      respray
      extras
      modEngine
      modBrakes
      modTransmission
      modSuspension
      modArmor
      modTurbo
      backWheel
      frontWheel
      respray           -- color
      interior          -- color
      dashboard         -- color
      pearlescent       -- color
      PrimaryColor
      SecondaryColor

]]

-- job = Only players with job (Config.JobNames) can access,
-- selfservice = Everyone can access,
Config.Zones = {
      {
            name        = "Mechanic",
            jobs        = { "mechanic" },
            coords      = vector3(246.4, -792.01, 30.44),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "job",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 3,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 0, -- 0 premium price for job zones
            isFree      = false,
            hideMods = {
                  --["modEngine"] = true,
                  --["modLivery"] = true
            }
      },
      {
            name        = "Auto Tuning",
            coords      = vector3(239.73, -808.61, 30.28),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "selfservice",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 5,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 10, -- 10% premium price for selfservice zones (more expensive)
            isFree      = false,
            hideMods = {}
      },
      {
            name        = "Auto Tuning",
            coords      = vector3(-338.67, -136.94, 38.3),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "selfservice",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 5,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 10,
            isFree      = false,
            hideMods = {}
      },
      {
            name        = "Auto Tuning",
            coords      = vector3(-211.97, -1324.18, 30.89),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "selfservice",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 5,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 10,
            isFree      = false,
            hideMods = {}
      },
}

Config.TurboEnabled = true -- Enable or Disable Turbo mod

Config.VehicleCustomization = {
      upgrades = {
            {
                  category = Locale("EngineUpgrade"),
                  id = 11,
                  mod = "modEngine",
                  img = 'img/upgrades/engine.svg',
                  basePrice = 3000
            },
            {
                  category = Locale("TransmissionUpgrade"),
                  id = 13,
                  mod = "modTransmission",
                  img =
                  "img/upgrades/transmission.svg",
                  basePrice = 1000
            },
            {
                  category = Locale("SuspensionUpgrade"),
                  id = 15,
                  mod = "modSuspension",
                  img =
                  "img/upgrades/suspension.svg",
                  basePrice = 6000
            },
            {
                  category = Locale("BrakesUpgrade"),
                  id = 12,
                  mod = "modBrakes",
                  img = 'img/upgrades/brakes.svg',
                  basePrice = 240
            },
            {
                  category = Locale("ArmorUpgrade"),
                  id = 16,
                  mod = "modArmor",
                  img = "img/upgrades/armor.svg",
                  basePrice = 3300
            },
      },
      cosmetics = {
            {
                  category = Locale('Spoiler'),
                  id = 0,
                  mod = "modSpoilers",
                  img = 'img/cosmetics/spoiler.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("FrontBumper"),
                  id = 1,
                  mod = "modFrontBumper",
                  img = 'img/cosmetics/frontbumper.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("RearBumper"),
                  id = 2,
                  mod = "modRearBumper",
                  img = 'img/cosmetics/rearbumper.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("SideSkirt"),
                  id = 3,
                  mod = "modSideSkirt",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Exhaust"),
                  id = 4,
                  mod = "modExhaust",
                  img = 'img/cosmetics/exhaust.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("RollCage"),
                  id = 5,
                  mod = "modFrame",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Grille"),
                  id = 6,
                  mod = "modGrille",
                  img = 'img/cosmetics/grille.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Hood"),
                  id = 7,
                  mod = "modHood",
                  img = 'img/cosmetics/hood.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("LeftFender"),
                  id = 8,
                  mod = "modFender",
                  img = 'img/cosmetics/leftfender.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("RightFender"),
                  id = 9,
                  mod = "modRightFender",
                  img = 'img/cosmetics/rightfender.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Roof"),
                  id = 10,
                  mod = "modRoof",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("VanityPlates"),
                  id = 25,
                  mod = "modVanityPlate",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("TrimA"),
                  id = 27,
                  mod = "modTrimA",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Ornaments"),
                  id = 28,
                  mod = "modOrnaments",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Dashboard"),
                  id = 29,
                  mod = "modDashboard",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Dial"),
                  id = 30,
                  mod = "modDial",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("DoorSpeaker"),
                  id = 31,
                  mod = "modDoorSpeaker",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Seats"),
                  id = 32,
                  mod = "modSeats",
                  img = 'img/cosmetics/seats.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("SteeringWheel"),
                  id = 33,
                  mod = "modSteeringWheel",
                  img = 'img/cosmetics/steeringwheel.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("ShifterLeaver"),
                  id = 34,
                  mod = "modShifterLeavers",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Plaque"),
                  id = 35,
                  mod = "modAPlate",
                  img = 'img/cosmetics/plate.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Speaker"),
                  id = 36,
                  mod = "modSpeakers",
                  img = 'img/cosmetics/speaker.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Trunk"),
                  id = 37,
                  mod = "modTrunk",
                  img = 'img/cosmetics/trunk.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Hydraulic"),
                  id = 38,
                  mod = "modHydrolic",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("EngineBlock"),
                  id = 39,
                  mod = "modEngineBlock",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("AirFilter"),
                  id = 40,
                  mod = "modAirFilter",
                  img = 'img/cosmetics/airfilter.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Strut"),
                  id = 41,
                  mod = "modStruts",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("ArchCover"),
                  id = 42,
                  mod = "modArchCover",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Aerial"),
                  id = 43,
                  mod = "modAerials",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("TrimB"),
                  id = 44,
                  mod = "modTrimB",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("FuelTank"),
                  id = 45,
                  mod = "modTank",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Window"),
                  id = 46,
                  mod = "modWindows",
                  img = 'img/cosmetics/window.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Livery"),
                  id = 48,
                  mod = "modLivery",
                  img = 'img/cosmetics/livery.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Horns"),
                  id = 14,
                  mod = "modHorns",
                  img = 'img/cosmetics/horns.svg',
                  basePrice = 300
            }
      },
}

Config.ExtraStuff = {
      Paints = {
            [0] = {
                  id = 0,
                  label = Locale('Normal'),
                  price = 2000,
            },
            [1] = {
                  id = 1,
                  label = Locale('Metallic'),
                  price = 3000,
            },
            [2] = {
                  id = 2,
                  label = Locale('Pearl'),
                  price = 4000,
            },
            [3] = {
                  id = 3,
                  label = Locale("Matte"),
                  price = 5000,
            },
            [4] = {
                  id = 4,
                  label = Locale("Metal"),
                  price = 6000,
            },
            [5] = {
                  id = 5,
                  label = Locale("Chrome"),
                  price = 7000,
            },
      },

      OtherPaints = {
            pearlescent = {
                  prices = {
                        classic = 1000,
                        metallic = 2000,
                        matte = 3000,
                        metals = 4000,
                  }
            },
            dashboard = {
                  prices = {
                        classic = 5000,
                        metallic = 6000,
                        matte = 7000,
                        metals = 8000,
                  }
            },
            interior = {
                  prices = {
                        classic = 9000,
                        metallic = 10000,
                        matte = 11000,
                        metals = 12000,
                  }
            },
            wheels = {
                  prices = {
                        classic = 13000,
                        metallic = 14000,
                        matte = 15000,
                        metals = 16000,
                  }
            },
      },

      Plates = {
            { name = Locale("BlueOnWhite1"),  id = 0, price = 150 },
            { name = Locale("BlueOnWhite2"),  id = 3, price = 150 },
            { name = Locale("BlueOnWhite3"),  id = 4, price = 150 },
            { name = Locale("YellowOnBlue"),  id = 2, price = 150 },
            { name = Locale("YellowOnBlack"), id = 1, price = 150 },
            { name = Locale("Yankton"),       id = 5, price = 150 },
      },

      WindowTintOptions = {
            { name = Locale("None"),       id = 0, price = 0 },
            { name = Locale("LightSmoke"), id = 3, price = 1000 },
            { name = Locale("DarkSmoke"),  id = 2, price = 2000 },
            { name = Locale("PureBlack"),  id = 1, price = 3000 },
      },

      ColorPickerPrices = {
            BodyPaint = 1000,
            Xenons = 1000,
            NeonColor = 400,
            TyreSmokeColor = 300
      },

      modTurbo = 2000,
      XenonPrice = 2000,
      NeonLightsPrice = 500,

      WheelsPrice = {
            [0] = {
                  label = Locale("Sport"),
                  price = 1000
            },
            [1] = {
                  label = Locale("Muscle"),
                  price = 2000
            },
            [2] = {
                  label = Locale("Lowrider"),
                  price = 3000
            },
            [3] = {
                  label = Locale("SUV"),
                  price = 4000
            },
            [4] = {
                  label = Locale("Offroad"),
                  price = 5000
            },
            [5] = {
                  label = Locale("Tuner"),
                  price = 1000
            },
            [6] = {
                  label = Locale("Motorcycle"),
                  price = 1000
            },
            [7] = {
                  label = Locale("Highend"),
                  price = 1000
            },
            [8] = {
                  label = Locale("BennysWheel"),
                  price = 1000
            },
            [9] = {
                  label = Locale("BespokeWheel"),
                  price = 1000
            },
            [10] = {
                  label = Locale("Dragster"),
                  price = 1000
            },
            [11] = {
                  label = Locale("Street"),
                  price = 1000
            },
            [12] = {
                  label = Locale("Rally"),
                  price = 1000
            }
      },

      CustomTiresPrice = 1000,
      BulletProofTyresPrice = 6000,
      TyreSmokePrice = 1000,

      Extras = {
            price = 1000,
      },

      images = {
            turbo = 'img/upgrades/turbo.svg',
            respray = 'img/cosmetics/respray.svg',
            xenons = 'img/cosmetics/xenon.svg',
            extras = 'img/cosmetics/plus.svg',
            neons = 'img/cosmetics/neons.svg',
            window = 'img/cosmetics/window.svg',
            plates = 'img/cosmetics/plate.svg',
            wheels = 'img/cosmetics/tyres.svg',
      },
      RoofLiveries = {
            label = Locale('RoofLiveries'),
            basePrice = 1000,
            img = 'img/cosmetics/livery.svg',
      },
}

Config.HornPreviewDuration = 2500

Config.Horns = {
      { name = "Truck Horn",             id = 0 },
      { name = "Cop Horn",               id = 1 },
      { name = "Clown Horn",             id = 2 },
      { name = "Musical Horn 1",         id = 3 },
      { name = "Musical Horn 2",         id = 4 },
      { name = "Musical Horn 3",         id = 5 },
      { name = "Musical Horn 4",         id = 6 },
      { name = "Musical Horn 5",         id = 7 },
      { name = "Sad Trombone",           id = 8 },
      { name = "Classical Horn 1",       id = 9 },
      { name = "Classical Horn 2",       id = 10 },
      { name = "Classical Horn 3",       id = 11 },
      { name = "Classical Horn 4",       id = 12 },
      { name = "Classical Horn 5",       id = 13 },
      { name = "Classical Horn 6",       id = 14 },
      { name = "Classical Horn 7",       id = 15 },
      { name = "Scale - Do",             id = 16 },
      { name = "Scale - Re",             id = 17 },
      { name = "Scale - Mi",             id = 18 },
      { name = "Scale - Fa",             id = 19 },
      { name = "Scale - Sol",            id = 20 },
      { name = "Scale - La",             id = 21 },
      { name = "Scale - Ti",             id = 22 },
      { name = "Scale - Do",             id = 23 },
      { name = "Jazz Horn 1",            id = 24 },
      { name = "Jazz Horn 2",            id = 25 },
      { name = "Jazz Horn 3",            id = 26 },
      { name = "Jazz Horn Loop",         id = 27 },
      { name = "Star Spangled Banner 1", id = 28 },
      { name = "Star Spangled Banner 2", id = 29 },
      { name = "Star Spangled Banner 3", id = 30 },
      { name = "Star Spangled Banner 4", id = 31 },
      { name = "Classical Horn 8 Loop",  id = 32 },
      { name = "Classical Horn 9 Loop",  id = 33 },
      { name = "Classical Horn 10 Loop", id = 34 },
      { name = "Classical Horn 8",       id = 35 },
      { name = "Classical Horn 9",       id = 36 },
      { name = "Classical Horn 10",      id = 37 },
      { name = "Funeral Loop",           id = 38 },
      { name = "Funeral",                id = 39 },
      { name = "Spooky Loop",            id = 40 },
      { name = "Spooky",                 id = 41 },
      { name = "San Andreas Loop",       id = 42 },
      { name = "San Andreas",            id = 43 },
      { name = "Liberty City Loop",      id = 44 },
      { name = "Liberty City",           id = 45 },
      { name = "Festive 1 Loop",         id = 46 },
      { name = "Festive 1",              id = 47 },
      { name = "Festive 2 Loop",         id = 48 },
      { name = "Festive 2",              id = 49 },
      { name = "Festive 3 Loop",         id = 50 },
      { name = "Festive 3",              id = 51 }
}

Config.GtaColors = {
      {
            category = "classic",
            label = Locale("Classic"),
            id = 0,
            colors = {
                  { name = "Black",            id = 0 },
                  { name = "Carbon Black",     id = 147 },
                  { name = "Graphite",         id = 1 },
                  { name = "Anhracite Black",  id = 11 },
                  { name = "Black Steel",      id = 11 },
                  { name = "Dark Steel",       id = 3 },
                  { name = "Silver",           id = 4 },
                  { name = "Bluish Silver",    id = 5 },
                  { name = "Rolled Steel",     id = 6 },
                  { name = "Shadow Silver",    id = 7 },
                  { name = "Stone Silver",     id = 8 },
                  { name = "Midnight Silver",  id = 9 },
                  { name = "Cast Iron Silver", id = 10 },
                  { name = "Red",              id = 27 },
                  { name = "Torino Red",       id = 28 },
                  { name = "Formula Red",      id = 29 },
                  { name = "Lava Red",         id = 150 },
                  { name = "Blaze Red",        id = 30 },
                  { name = "Grace Red",        id = 31 },
                  { name = "Garnet Red",       id = 32 },
                  { name = "Sunset Red",       id = 33 },
                  { name = "Cabernet Red",     id = 34 },
                  { name = "Wine Red",         id = 143 },
                  { name = "Candy Red",        id = 35 },
                  { name = "Hot Pink",         id = 135 },
                  { name = "Pfsiter Pink",     id = 137 },
                  { name = "Salmon Pink",      id = 136 },
                  { name = "Sunrise Orange",   id = 36 },
                  { name = "Orange",           id = 38 },
                  { name = "Bright Orange",    id = 138 },
                  { name = "Gold",             id = 99 },
                  { name = "Bronze",           id = 90 },
                  { name = "Yellow",           id = 88 },
                  { name = "Race Yellow",      id = 89 },
                  { name = "Dew Yellow",       id = 91 },
                  { name = "Dark Green",       id = 49 },
                  { name = "Racing Green",     id = 50 },
                  { name = "Sea Green",        id = 51 },
                  { name = "Olive Green",      id = 52 },
                  { name = "Bright Green",     id = 53 },
                  { name = "Gasoline Green",   id = 54 },
                  { name = "Lime Green",       id = 92 },
                  { name = "Midnight Blue",    id = 141 },
                  { name = "Galaxy Blue",      id = 61 },
                  { name = "Dark Blue",        id = 62 },
                  { name = "Saxon Blue",       id = 63 },
                  { name = "Blue",             id = 64 },
                  { name = "Mariner Blue",     id = 65 },
                  { name = "Harbor Blue",      id = 66 },
                  { name = "Diamond Blue",     id = 67 },
                  { name = "Surf Blue",        id = 68 },
                  { name = "Nautical Blue",    id = 69 },
                  { name = "Racing Blue",      id = 73 },
                  { name = "Ultra Blue",       id = 70 },
                  { name = "Light Blue",       id = 74 },
                  { name = "Chocolate Brown",  id = 96 },
                  { name = "Bison Brown",      id = 101 },
                  { name = "Creeen Brown",     id = 95 },
                  { name = "Feltzer Brown",    id = 94 },
                  { name = "Maple Brown",      id = 97 },
                  { name = "Beechwood Brown",  id = 103 },
                  { name = "Sienna Brown",     id = 104 },
                  { name = "Saddle Brown",     id = 98 },
                  { name = "Moss Brown",       id = 100 },
                  { name = "Woodbeech Brown",  id = 102 },
                  { name = "Straw Brown",      id = 99 },
                  { name = "Sandy Brown",      id = 105 },
                  { name = "Bleached Brown",   id = 106 },
                  { name = "Schafter Purple",  id = 71 },
                  { name = "Spinnaker Purple", id = 72 },
                  { name = "Midnight Purple",  id = 142 },
                  { name = "Bright Purple",    id = 145 },
                  { name = "Cream",            id = 107 },
                  { name = "Ice White",        id = 111 },
                  { name = "Frost White",      id = 112 }
            }
      },
      {
            category = "metallic",
            label = Locale("Metallic"),
            id = 1,
            colors = { { name = "Black", id = 0 },
                  { name = "Carbon Black",     id = 147 },
                  { name = "Graphite",         id = 1 },
                  { name = "Anhracite Black",  id = 11 },
                  { name = "Black Steel",      id = 11 },
                  { name = "Dark Steel",       id = 3 },
                  { name = "Silver",           id = 4 },
                  { name = "Bluish Silver",    id = 5 },
                  { name = "Rolled Steel",     id = 6 },
                  { name = "Shadow Silver",    id = 7 },
                  { name = "Stone Silver",     id = 8 },
                  { name = "Midnight Silver",  id = 9 },
                  { name = "Cast Iron Silver", id = 10 },
                  { name = "Red",              id = 27 },
                  { name = "Torino Red",       id = 28 },
                  { name = "Formula Red",      id = 29 },
                  { name = "Lava Red",         id = 150 },
                  { name = "Blaze Red",        id = 30 },
                  { name = "Grace Red",        id = 31 },
                  { name = "Garnet Red",       id = 32 },
                  { name = "Sunset Red",       id = 33 },
                  { name = "Cabernet Red",     id = 34 },
                  { name = "Wine Red",         id = 143 },
                  { name = "Candy Red",        id = 35 },
                  { name = "Hot Pink",         id = 135 },
                  { name = "Pfsiter Pink",     id = 137 },
                  { name = "Salmon Pink",      id = 136 },
                  { name = "Sunrise Orange",   id = 36 },
                  { name = "Orange",           id = 38 },
                  { name = "Bright Orange",    id = 138 },
                  { name = "Gold",             id = 99 },
                  { name = "Bronze",           id = 90 },
                  { name = "Yellow",           id = 88 },
                  { name = "Race Yellow",      id = 89 },
                  { name = "Dew Yellow",       id = 91 },
                  { name = "Dark Green",       id = 49 },
                  { name = "Racing Green",     id = 50 },
                  { name = "Sea Green",        id = 51 },
                  { name = "Olive Green",      id = 52 },
                  { name = "Bright Green",     id = 53 },
                  { name = "Gasoline Green",   id = 54 },
                  { name = "Lime Green",       id = 92 },
                  { name = "Midnight Blue",    id = 141 },
                  { name = "Galaxy Blue",      id = 61 },
                  { name = "Dark Blue",        id = 62 },
                  { name = "Saxon Blue",       id = 63 },
                  { name = "Blue",             id = 64 },
                  { name = "Mariner Blue",     id = 65 },
                  { name = "Harbor Blue",      id = 66 },
                  { name = "Diamond Blue",     id = 67 },
                  { name = "Surf Blue",        id = 68 },
                  { name = "Nautical Blue",    id = 69 },
                  { name = "Racing Blue",      id = 73 },
                  { name = "Ultra Blue",       id = 70 },
                  { name = "Light Blue",       id = 74 },
                  { name = "Chocolate Brown",  id = 96 },
                  { name = "Bison Brown",      id = 101 },
                  { name = "Creeen Brown",     id = 95 },
                  { name = "Feltzer Brown",    id = 94 },
                  { name = "Maple Brown",      id = 97 },
                  { name = "Beechwood Brown",  id = 103 },
                  { name = "Sienna Brown",     id = 104 },
                  { name = "Saddle Brown",     id = 98 },
                  { name = "Moss Brown",       id = 100 },
                  { name = "Woodbeech Brown",  id = 102 },
                  { name = "Straw Brown",      id = 99 },
                  { name = "Sandy Brown",      id = 105 },
                  { name = "Bleached Brown",   id = 106 },
                  { name = "Schafter Purple",  id = 71 },
                  { name = "Spinnaker Purple", id = 72 },
                  { name = "Midnight Purple",  id = 142 },
                  { name = "Bright Purple",    id = 145 },
                  { name = "Cream",            id = 107 },
                  { name = "Ice White",        id = 111 },
                  { name = "Frost White",      id = 112 }
            }
      },
      {
            category = "matte",
            label = Locale("Matte"),
            id = 2,
            colors = { { name = "Black", id = 12 },
                  { name = "Gray",            id = 13 },
                  { name = "Light Gray",      id = 14 },
                  { name = "Ice White",       id = 131 },
                  { name = "Blue",            id = 83 },
                  { name = "Dark Blue",       id = 82 },
                  { name = "Midnight Blue",   id = 84 },
                  { name = "Midnight Purple", id = 149 },
                  { name = "Schafter Purple", id = 148 },
                  { name = "Red",             id = 39 },
                  { name = "Dark Red",        id = 40 },
                  { name = "Orange",          id = 41 },
                  { name = "Yellow",          id = 42 },
                  { name = "Lime Green",      id = 55 },
                  { name = "Green",           id = 128 },
                  { name = "Forest Green",    id = 151 },
                  { name = "Foliage Green",   id = 155 },
                  { name = "Olive Darb",      id = 152 },
                  { name = "Dark Earth",      id = 153 },
                  { name = "Desert Tan",      id = 154 }
            }
      },
      {
            category = "metals",
            label = Locale("Metals"),
            id = 3,
            colors = {
                  { name = "Brushed Steel",       id = 117 },
                  { name = "Brushed Black Steel", id = 118 },
                  { name = "Brushed Aluminium",   id = 119 },
                  { name = "Pure Gold",           id = 158 },
                  { name = "Brushed Gold",        id = 159 },
                  { name = "Chrome",              id = 120 }
            }
      }
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to sv_utils.lua, line 3

Config.BotName = 'ServerName'       -- Write the desired bot name

Config.ServerName = 'ServerName'    -- Write your server's name

Config.IconURL = ''                 -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.WebhookColor = '65352'
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config = {}

Config.Debug = false -- May print some debug messages in the console

Config.DeleteVehicleOnPlayerLeave = true -- If true, it'll delete the vehicle when the player leaves the server and has the menu open

Config.Locale = 'en' -- en / pt / gr / fr / de / es

Config.EventPrefix = 'okokTuning'

Config.UISounds = true -- Enable/Disable UI Sounds

Config.Currency = {
      -- Menu Currency, Supports ISO codes only
      locale = 'en-US', -- https://www.localeplanet.com/icu/
      currency = 'USD', -- https://www.localeplanet.com/icu/currency.html
}

Config.SocietyPay = true                -- If true, it'll use the society money to pay the bills

Config.UseMoneyAccount = "bank"         -- What account to use when paying bills

Config.OpenAnywhere = false             -- If true, you can open the menu anywhere (use event 'okokTuning:openTuningMenu')
Config.AllowTuneWhenDamaged = true      -- If true, it'll allow you to tune the vehicle even if it's damaged
Config.RepairMenu = true                -- If true, it'll use the repair menu
Config.RepairCommand = 'trepair'        -- Repair command | Ace Permission: okokTuning.repair
Config.AdminCommand = 'tuning'          -- Admin command to open the menu | Ace Permission: okokTuning.admin
Config.VehicleStatsCommand = 'vehstats' -- Vehicle stats command (vehicle model, engine, transmission, etc)

Config.JobsThatCanUseRepairCommand = {  -- Jobs that can use the repair command
      'mechanic',
}

Config.QBManagement = true                 -- If set to true it will use the qb-management resource, if set to false it will use the okokBanking database tables

Config.UseOkOkTextUI = false               -- If true, you need to have okokTextUI installed and configured.
Config.UseOkokNotify = true                -- If true, you need to have okokNotify installed and configured.
Config.UseOkokBanking = true               -- If true, you need to have okokBanking installed and configured.
Config.SocietyHasPrefix = false            -- If true, it'll use the society prefix for the transactions (society_job)
Config.UseOkokVehicleShop = false          -- If true, it'll use the price of the vehicles in okokVehicleShop.

Config.PricingMethod =
"fixed"                                    -- "fixed" = Fixed price per category | "percentage" = Percentage of the base price
Config.PricingPercentage = 0.05            -- Decimal Percentage of the Vehicles Price Impact on the Option price

Config.RepairPrice = 500.0                 -- Price to repair the vehicle
Config.RepairPriceDependsOnDamage = true   -- If true, RepairPrice will be the max price depending on the damage.

Config.ShowRecommendedInvoicePrice = false -- If true, it'll show the recommended invoice price
Config.PercentageAbovePrice = 50           -- Percentage above the price to show as recommended

Config.RemovableMods = { --[[ Remove Mods, if true, the mod will be removed from the vehicle. ]]
      BulletProofTires = false,
}

Config.OpenMenuKey = 38 -- E
Config.FreecamKey = "q"

Config.UseInspectCameras = true    -- If true, you can inspect the vehicle with the cameras
Config.CameraTransitionTime = 0.75 -- Time in seconds to change the camera

Config.InspectVehicleCameras = {
      ['cars'] = {
            { showButton = true,  bone = 'wheel_lr',      displayName = 'Left Wheel',     cameraOffset = vector3(-2.0, -1.2, 0.0), openDoors = {},             mods = { 'wheels' } },
            { showButton = true,  bone = 'window_rf',     displayName = 'Right Window',   cameraOffset = vector3(1.0, 1.0, 0.0),   openDoors = {},             mods = { 'modWindows', 'windowTint' } },
            { showButton = true,  bone = 'headlight_l',   displayName = 'Headlight',      cameraOffset = vector3(-1.0, 2.0, 0.0),  openDoors = {},             mods = { 'modArchCover', 'modAerials' } },
            { showButton = false, bone = 'wheel_lf',      displayName = 'Left Bumper',    cameraOffset = vector3(-2.0, 1.0, 1.0),  openDoors = {},             mods = { 'modFender' } },
            { showButton = false, bone = 'exhaust',       displayName = 'Exhaust',        cameraOffset = vector3(-0.5, -2.0, 0.0), openDoors = {},             mods = { 'modExhaust' } },
            { showButton = false, bone = 'windscreen_r',  displayName = 'Back Window',    cameraOffset = vector3(-1.0, -3.5, 1.5), openDoors = {},             mods = { 'modSpoilers' } },
            { showButton = false, bone = 'windscreen_r',  displayName = 'Roll Cage',      cameraOffset = vector3(0.0, 1.8, 0.0),   openDoors = {},             mods = { 'modFrame' } },
            { showButton = false, bone = 'windscreen',    displayName = 'Interior',       cameraOffset = vector3(0.2, -1.0, 0.0),  openDoors = {},             mods = { 'interior', 'dashboard', 'modDashboard' } },
            { showButton = false, bone = 'windscreen',    displayName = 'Hood',           cameraOffset = vector3(0.0, 3.0, 1.0),   openDoors = {},             mods = { 'modHood' } },
            { showButton = false, bone = 'windscreen',    displayName = 'Motor Changes',  cameraOffset = vector3(0.0, 3.0, 1.0),   openDoors = { 4 },          mods = { 'modEngineBlock', 'modAirFilter', 'modStruts' } },
            { showButton = false, bone = 'windscreen',    displayName = 'Seats',          cameraOffset = vector3(0.0, 1.0, 0.2),   openDoors = {},             mods = { 'modSeats' } },
            { showButton = false, bone = 'dials',         displayName = 'Colors',         cameraOffset = vector3(-3.0, 5.0, 2.5),  openDoors = {},             mods = { 'respray', 'PrimaryColor', 'SecondaryColor', 'pearlescent', 'modLivery' } },
            { showButton = false, bone = 'neon_l',        displayName = 'Side skirt',     cameraOffset = vector3(-2.0, -1.0, 0.3), openDoors = {},             mods = { 'modSideSkirt' } },
            { showButton = false, bone = 'neon_f',        displayName = 'Vehicle Front',  cameraOffset = vector3(0.0, 2.0, 1.0),   openDoors = {},             mods = { 'modGrille', 'FrontNeon', 'modFrontBumper', 'modXenon', 'modVanityPlate' } },
            { showButton = false, bone = 'neon_b',        displayName = 'Vehicle Back',   cameraOffset = vector3(0.0, -2.0, 1.0),  openDoors = {},             mods = { 'plateIndex', 'BackNeon', 'modRearBumper' } },
            { showButton = false, bone = 'neon_r',        displayName = 'Right Neon',     cameraOffset = vector3(2.0, 0.0, 1.0),   openDoors = {},             mods = { 'RightNeon' } },
            { showButton = false, bone = 'neon_l',        displayName = 'Left Neon',      cameraOffset = vector3(-2.0, 0.0, 1.0),  openDoors = {},             mods = { 'LeftNeon' } },
            { showButton = false, bone = 'interiorlight', displayName = 'Vehicle Roof',   cameraOffset = vector3(0.0, 2.0, 1.0),   openDoors = {},             mods = { 'modRoof', 'modTrimB', 'modTrimA' } },
            { showButton = false, bone = 'dashglow',      displayName = 'Steering wheel', cameraOffset = vector3(0.0, -0.5, -0.1), openDoors = {},             mods = { 'modSteeringWheel' } },
            { showButton = false, bone = 'door_pside_f',  displayName = 'Interior Door',  cameraOffset = vector3(-1.0, -1.0, 0.2), openDoors = { --[[ 0, 1 ]] }, mods = { 'modDoorSpeaker' } },
      },
      ['motorcycles'] = {
            { showButton = true,  bone = 'wheel_lr',    displayName = 'Rear Wheel',   cameraOffset = vector3(-2.0, -1.0, 0.0), openDoors = {}, mods = { 'backWheel', 'wheels' } },
            { showButton = true,  bone = 'wheel_lf',    displayName = 'Front Wheel',  cameraOffset = vector3(-2.0, 1.0, 0.0),  openDoors = {}, mods = { 'frontWheel' } },
            { showButton = true,  bone = 'engine',      displayName = 'Engine',       cameraOffset = vector3(-1.0, 0.5, 0.0),  openDoors = {}, mods = { 'modEngineBlock', 'modAirFilter' } },
            { showButton = false, bone = 'wheel_lf',    displayName = 'Front Bumper', cameraOffset = vector3(-1.5, 0.0, 0.5),  openDoors = {}, mods = { 'modFrontBumper' } },
            { showButton = false, bone = 'wheel_lr',    displayName = 'Rear Bumper',  cameraOffset = vector3(-1.5, 0.0, 0.5),  openDoors = {}, mods = { 'modRearBumper' } },
            { showButton = false, bone = 'engine',      displayName = 'Side Skirt',   cameraOffset = vector3(-1.5, 1.0, 0.0),  openDoors = {}, mods = { 'modSideSkirt' } },
            { showButton = false, bone = 'exhaust',     displayName = 'Exhaust',      cameraOffset = vector3(1.5, -1.0, 0.5),  openDoors = {}, mods = { 'modExhaust' } },
            { showButton = false, bone = 'taillight_r', displayName = 'Plate',        cameraOffset = vector3(0.3, -1.5, 0.0),  openDoors = {}, mods = { 'plateIndex' } },
            { showButton = false, bone = 'taillight_l', displayName = 'Plate',        cameraOffset = vector3(0.3, -1.5, 0.0),  openDoors = {}, mods = { 'plateIndex' } },
            { showButton = false, bone = 'headlight_l', displayName = 'Headlight',    cameraOffset = vector3(0.0, 2.0, 0.0),   openDoors = {}, mods = { 'modXenon' } },
            { showButton = false, bone = 'engine',      displayName = 'Colors',       cameraOffset = vector3(-3.0, 3.0, 1.5),  openDoors = {}, mods = { 'respray', 'PrimaryColor', 'SecondaryColor', 'pearlescent', 'modLivery' } },
            { showButton = false, bone = 'engine',      displayName = 'Whole Bike',   cameraOffset = vector3(-2.0, 1.0, 1.0),  openDoors = {}, mods = { 'modAerials', 'modTrimB', 'modRoof', 'modFrame', 'modHood', 'modFender', 'modRightFender', 'modTank' } },
            { showButton = false, bone = 'engine',      displayName = 'Seat',         cameraOffset = vector3(-2.0, -1.0, 1.0), openDoors = {}, mods = { 'modSeats' } },
            { showButton = false, bone = 'engine',      displayName = 'Spoilers',     cameraOffset = vector3(-2.0, 2.0, 1.0),  openDoors = {}, mods = { 'modSpoilers' } },
      }
}


--[[
      Inspect Vehicle Cameras:

      Bones: https://pastebin.com/D7JMnX1g
      Make sure you use the vehicle bones, some may not work


      List of mods:

      FrontNeon
      BackNeon
      RightNeon
      LeftNeon
      modEngine
      modBrakes
      modTransmission
      modSuspension
      modArmor
      modSpoilers
      modFrontBumper
      modRearBumper
      modSideSkirt
      modExhaust
      modFrame
      modGrille
      modHood
      modFender
      modRightFender
      modRoof
      modVanityPlate
      modTrimA
      modOrnaments
      modDashboard
      modDial
      modDoorSpeaker
      modSeats
      modSteeringWheel
      modShifterLeavers
      modAPlate
      modSpeakers
      modTrunk
      modHydrolic
      modEngineBlock
      modAirFilter
      modStruts
      modArchCover
      modAerials
      modTrimB
      modTank
      modWindows
      modLivery
      modHorns
      modFrame
      windowTint
      wheels
      plateIndex
      neons
      modXenon
      respray
      extras
      modEngine
      modBrakes
      modTransmission
      modSuspension
      modArmor
      modTurbo
      backWheel
      frontWheel
      respray           -- color
      interior          -- color
      dashboard         -- color
      pearlescent       -- color
      PrimaryColor
      SecondaryColor

]]

-- job = Only players with job (Config.JobNames) can access,
-- selfservice = Everyone can access,
Config.Zones = {
      {
            name        = "Mechanic",
            jobs        = { "mechanic" },
            coords      = vector3(246.4, -792.01, 30.44),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "job",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 3,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 0, -- 0 premium price for job zones
            isFree      = false,
            hideMods    = {
                  --["modEngine"] = true,
                  --["modLivery"] = true
            }
      },
      {
            name        = "Auto Tuning",
            coords      = vector3(239.73, -808.61, 30.28),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "selfservice",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 5,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 10, -- 10% premium price for selfservice zones (more expensive)
            isFree      = false,
            hideMods    = {}
      },
      {
            name        = "Auto Tuning",
            coords      = vector3(-338.67, -136.94, 38.3),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "selfservice",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 5,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 10,
            isFree      = false,
            hideMods    = {}
      },
      {
            name        = "Auto Tuning",
            coords      = vector3(-211.97, -1324.18, 30.89),
            size        = vector3(5, 5, 5),
            rotation    = 70,
            type        = "selfservice",
            debug       = false,
            blipIcon    = 72,
            blipColor   = 5,
            blipDisplay = 4,
            blipScale   = 0.7,
            blipEnabled = true,
            premium     = 10,
            isFree      = false,
            hideMods    = {}
      },
}

Config.TurboEnabled = true -- Enable or Disable Turbo mod

Config.VehicleCustomization = {
      upgrades = {
            {
                  category = Locale("EngineUpgrade"),
                  id = 11,
                  mod = "modEngine",
                  img = 'img/upgrades/engine.svg',
                  basePrice = 3000
            },
            {
                  category = Locale("TransmissionUpgrade"),
                  id = 13,
                  mod = "modTransmission",
                  img =
                  "img/upgrades/transmission.svg",
                  basePrice = 1000
            },
            {
                  category = Locale("SuspensionUpgrade"),
                  id = 15,
                  mod = "modSuspension",
                  img =
                  "img/upgrades/suspension.svg",
                  basePrice = 6000
            },
            {
                  category = Locale("BrakesUpgrade"),
                  id = 12,
                  mod = "modBrakes",
                  img = 'img/upgrades/brakes.svg',
                  basePrice = 240
            },
            {
                  category = Locale("ArmorUpgrade"),
                  id = 16,
                  mod = "modArmor",
                  img = "img/upgrades/armor.svg",
                  basePrice = 3300
            },
      },
      cosmetics = {
            {
                  category = Locale('Spoiler'),
                  id = 0,
                  mod = "modSpoilers",
                  img = 'img/cosmetics/spoiler.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("FrontBumper"),
                  id = 1,
                  mod = "modFrontBumper",
                  img = 'img/cosmetics/frontbumper.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("RearBumper"),
                  id = 2,
                  mod = "modRearBumper",
                  img = 'img/cosmetics/rearbumper.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("SideSkirt"),
                  id = 3,
                  mod = "modSideSkirt",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Exhaust"),
                  id = 4,
                  mod = "modExhaust",
                  img = 'img/cosmetics/exhaust.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("RollCage"),
                  id = 5,
                  mod = "modFrame",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Grille"),
                  id = 6,
                  mod = "modGrille",
                  img = 'img/cosmetics/grille.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Hood"),
                  id = 7,
                  mod = "modHood",
                  img = 'img/cosmetics/hood.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("LeftFender"),
                  id = 8,
                  mod = "modFender",
                  img = 'img/cosmetics/leftfender.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("RightFender"),
                  id = 9,
                  mod = "modRightFender",
                  img = 'img/cosmetics/rightfender.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Roof"),
                  id = 10,
                  mod = "modRoof",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("VanityPlates"),
                  id = 25,
                  mod = "modVanityPlate",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("TrimA"),
                  id = 27,
                  mod = "modTrimA",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Ornaments"),
                  id = 28,
                  mod = "modOrnaments",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Dashboard"),
                  id = 29,
                  mod = "modDashboard",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Dial"),
                  id = 30,
                  mod = "modDial",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("DoorSpeaker"),
                  id = 31,
                  mod = "modDoorSpeaker",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Seats"),
                  id = 32,
                  mod = "modSeats",
                  img = 'img/cosmetics/seats.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("SteeringWheel"),
                  id = 33,
                  mod = "modSteeringWheel",
                  img = 'img/cosmetics/steeringwheel.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("ShifterLeaver"),
                  id = 34,
                  mod = "modShifterLeavers",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Plaque"),
                  id = 35,
                  mod = "modAPlate",
                  img = 'img/cosmetics/plate.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Speaker"),
                  id = 36,
                  mod = "modSpeakers",
                  img = 'img/cosmetics/speaker.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Trunk"),
                  id = 37,
                  mod = "modTrunk",
                  img = 'img/cosmetics/trunk.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Hydraulic"),
                  id = 38,
                  mod = "modHydrolic",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("EngineBlock"),
                  id = 39,
                  mod = "modEngineBlock",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("AirFilter"),
                  id = 40,
                  mod = "modAirFilter",
                  img = 'img/cosmetics/airfilter.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Strut"),
                  id = 41,
                  mod = "modStruts",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("ArchCover"),
                  id = 42,
                  mod = "modArchCover",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Aerial"),
                  id = 43,
                  mod = "modAerials",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("TrimB"),
                  id = 44,
                  mod = "modTrimB",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("FuelTank"),
                  id = 45,
                  mod = "modTank",
                  img = 'img/cosmetics/car.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Window"),
                  id = 46,
                  mod = "modWindows",
                  img = 'img/cosmetics/window.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Livery"),
                  id = 48,
                  mod = "modLivery",
                  img = 'img/cosmetics/livery.svg',
                  basePrice = 2000
            },
            {
                  category = Locale("Horns"),
                  id = 14,
                  mod = "modHorns",
                  img = 'img/cosmetics/horns.svg',
                  basePrice = 300
            }
      },
}

Config.ExtraStuff = {
      Paints = {
            [0] = {
                  id = 0,
                  label = Locale('Normal'),
                  price = 2000,
            },
            [1] = {
                  id = 1,
                  label = Locale('Metallic'),
                  price = 3000,
            },
            [2] = {
                  id = 2,
                  label = Locale('Pearl'),
                  price = 4000,
            },
            [3] = {
                  id = 3,
                  label = Locale("Matte"),
                  price = 5000,
            },
            [4] = {
                  id = 4,
                  label = Locale("Metal"),
                  price = 6000,
            },
            [5] = {
                  id = 5,
                  label = Locale("Chrome"),
                  price = 7000,
            },
      },

      OtherPaints = {
            pearlescent = {
                  prices = {
                        classic = 1000,
                        metallic = 2000,
                        matte = 3000,
                        metals = 4000,
                  }
            },
            dashboard = {
                  prices = {
                        classic = 5000,
                        metallic = 6000,
                        matte = 7000,
                        metals = 8000,
                  }
            },
            interior = {
                  prices = {
                        classic = 9000,
                        metallic = 10000,
                        matte = 11000,
                        metals = 12000,
                  }
            },
            wheels = {
                  prices = {
                        classic = 13000,
                        metallic = 14000,
                        matte = 15000,
                        metals = 16000,
                  }
            },
      },

      Plates = {
            { name = Locale("BlueOnWhite1"),  id = 0, price = 150 },
            { name = Locale("BlueOnWhite2"),  id = 3, price = 150 },
            { name = Locale("BlueOnWhite3"),  id = 4, price = 150 },
            { name = Locale("YellowOnBlue"),  id = 2, price = 150 },
            { name = Locale("YellowOnBlack"), id = 1, price = 150 },
            { name = Locale("Yankton"),       id = 5, price = 150 },
      },

      WindowTintOptions = {
            { name = Locale("None"),       id = 0, price = 0 },
            { name = Locale("LightSmoke"), id = 3, price = 1000 },
            { name = Locale("DarkSmoke"),  id = 2, price = 2000 },
            { name = Locale("PureBlack"),  id = 1, price = 3000 },
      },

      ColorPickerPrices = {
            BodyPaint = 1000,
            Xenons = 1000,
            NeonColor = 400,
            TyreSmokeColor = 300
      },

      modTurbo = 2000,
      XenonPrice = 2000,
      NeonLightsPrice = 500,

      WheelsPrice = {
            [0] = {
                  label = Locale("Sport"),
                  price = 1000
            },
            [1] = {
                  label = Locale("Muscle"),
                  price = 2000
            },
            [2] = {
                  label = Locale("Lowrider"),
                  price = 3000
            },
            [3] = {
                  label = Locale("SUV"),
                  price = 4000
            },
            [4] = {
                  label = Locale("Offroad"),
                  price = 5000
            },
            [5] = {
                  label = Locale("Tuner"),
                  price = 1000
            },
            [6] = {
                  label = Locale("Motorcycle"),
                  price = 1000
            },
            [7] = {
                  label = Locale("Highend"),
                  price = 1000
            },
            [8] = {
                  label = Locale("BennysWheel"),
                  price = 1000
            },
            [9] = {
                  label = Locale("BespokeWheel"),
                  price = 1000
            },
            [10] = {
                  label = Locale("Dragster"),
                  price = 1000
            },
            [11] = {
                  label = Locale("Street"),
                  price = 1000
            },
            [12] = {
                  label = Locale("Rally"),
                  price = 1000
            }
      },

      CustomTiresPrice = 1000,
      BulletProofTyresPrice = 6000,
      TyreSmokePrice = 1000,

      Extras = {
            price = 1000,
      },

      images = {
            turbo = 'img/upgrades/turbo.svg',
            respray = 'img/cosmetics/respray.svg',
            xenons = 'img/cosmetics/xenon.svg',
            extras = 'img/cosmetics/plus.svg',
            neons = 'img/cosmetics/neons.svg',
            window = 'img/cosmetics/window.svg',
            plates = 'img/cosmetics/plate.svg',
            wheels = 'img/cosmetics/tyres.svg',
      },
      RoofLiveries = {
            label = Locale('RoofLiveries'),
            basePrice = 1000,
            img = 'img/cosmetics/livery.svg',
      },
}

Config.HornPreviewDuration = 2500

Config.Horns = {
      { name = "Truck Horn",             id = 0 },
      { name = "Cop Horn",               id = 1 },
      { name = "Clown Horn",             id = 2 },
      { name = "Musical Horn 1",         id = 3 },
      { name = "Musical Horn 2",         id = 4 },
      { name = "Musical Horn 3",         id = 5 },
      { name = "Musical Horn 4",         id = 6 },
      { name = "Musical Horn 5",         id = 7 },
      { name = "Sad Trombone",           id = 8 },
      { name = "Classical Horn 1",       id = 9 },
      { name = "Classical Horn 2",       id = 10 },
      { name = "Classical Horn 3",       id = 11 },
      { name = "Classical Horn 4",       id = 12 },
      { name = "Classical Horn 5",       id = 13 },
      { name = "Classical Horn 6",       id = 14 },
      { name = "Classical Horn 7",       id = 15 },
      { name = "Scale - Do",             id = 16 },
      { name = "Scale - Re",             id = 17 },
      { name = "Scale - Mi",             id = 18 },
      { name = "Scale - Fa",             id = 19 },
      { name = "Scale - Sol",            id = 20 },
      { name = "Scale - La",             id = 21 },
      { name = "Scale - Ti",             id = 22 },
      { name = "Scale - Do",             id = 23 },
      { name = "Jazz Horn 1",            id = 24 },
      { name = "Jazz Horn 2",            id = 25 },
      { name = "Jazz Horn 3",            id = 26 },
      { name = "Jazz Horn Loop",         id = 27 },
      { name = "Star Spangled Banner 1", id = 28 },
      { name = "Star Spangled Banner 2", id = 29 },
      { name = "Star Spangled Banner 3", id = 30 },
      { name = "Star Spangled Banner 4", id = 31 },
      { name = "Classical Horn 8 Loop",  id = 32 },
      { name = "Classical Horn 9 Loop",  id = 33 },
      { name = "Classical Horn 10 Loop", id = 34 },
      { name = "Classical Horn 8",       id = 35 },
      { name = "Classical Horn 9",       id = 36 },
      { name = "Classical Horn 10",      id = 37 },
      { name = "Funeral Loop",           id = 38 },
      { name = "Funeral",                id = 39 },
      { name = "Spooky Loop",            id = 40 },
      { name = "Spooky",                 id = 41 },
      { name = "San Andreas Loop",       id = 42 },
      { name = "San Andreas",            id = 43 },
      { name = "Liberty City Loop",      id = 44 },
      { name = "Liberty City",           id = 45 },
      { name = "Festive 1 Loop",         id = 46 },
      { name = "Festive 1",              id = 47 },
      { name = "Festive 2 Loop",         id = 48 },
      { name = "Festive 2",              id = 49 },
      { name = "Festive 3 Loop",         id = 50 },
      { name = "Festive 3",              id = 51 }
}

Config.GtaColors = {
      {
            category = "classic",
            label = Locale("Classic"),
            id = 0,
            colors = {
                  { name = "Black",            id = 0 },
                  { name = "Carbon Black",     id = 147 },
                  { name = "Graphite",         id = 1 },
                  { name = "Anhracite Black",  id = 11 },
                  { name = "Black Steel",      id = 11 },
                  { name = "Dark Steel",       id = 3 },
                  { name = "Silver",           id = 4 },
                  { name = "Bluish Silver",    id = 5 },
                  { name = "Rolled Steel",     id = 6 },
                  { name = "Shadow Silver",    id = 7 },
                  { name = "Stone Silver",     id = 8 },
                  { name = "Midnight Silver",  id = 9 },
                  { name = "Cast Iron Silver", id = 10 },
                  { name = "Red",              id = 27 },
                  { name = "Torino Red",       id = 28 },
                  { name = "Formula Red",      id = 29 },
                  { name = "Lava Red",         id = 150 },
                  { name = "Blaze Red",        id = 30 },
                  { name = "Grace Red",        id = 31 },
                  { name = "Garnet Red",       id = 32 },
                  { name = "Sunset Red",       id = 33 },
                  { name = "Cabernet Red",     id = 34 },
                  { name = "Wine Red",         id = 143 },
                  { name = "Candy Red",        id = 35 },
                  { name = "Hot Pink",         id = 135 },
                  { name = "Pfsiter Pink",     id = 137 },
                  { name = "Salmon Pink",      id = 136 },
                  { name = "Sunrise Orange",   id = 36 },
                  { name = "Orange",           id = 38 },
                  { name = "Bright Orange",    id = 138 },
                  { name = "Gold",             id = 99 },
                  { name = "Bronze",           id = 90 },
                  { name = "Yellow",           id = 88 },
                  { name = "Race Yellow",      id = 89 },
                  { name = "Dew Yellow",       id = 91 },
                  { name = "Dark Green",       id = 49 },
                  { name = "Racing Green",     id = 50 },
                  { name = "Sea Green",        id = 51 },
                  { name = "Olive Green",      id = 52 },
                  { name = "Bright Green",     id = 53 },
                  { name = "Gasoline Green",   id = 54 },
                  { name = "Lime Green",       id = 92 },
                  { name = "Midnight Blue",    id = 141 },
                  { name = "Galaxy Blue",      id = 61 },
                  { name = "Dark Blue",        id = 62 },
                  { name = "Saxon Blue",       id = 63 },
                  { name = "Blue",             id = 64 },
                  { name = "Mariner Blue",     id = 65 },
                  { name = "Harbor Blue",      id = 66 },
                  { name = "Diamond Blue",     id = 67 },
                  { name = "Surf Blue",        id = 68 },
                  { name = "Nautical Blue",    id = 69 },
                  { name = "Racing Blue",      id = 73 },
                  { name = "Ultra Blue",       id = 70 },
                  { name = "Light Blue",       id = 74 },
                  { name = "Chocolate Brown",  id = 96 },
                  { name = "Bison Brown",      id = 101 },
                  { name = "Creeen Brown",     id = 95 },
                  { name = "Feltzer Brown",    id = 94 },
                  { name = "Maple Brown",      id = 97 },
                  { name = "Beechwood Brown",  id = 103 },
                  { name = "Sienna Brown",     id = 104 },
                  { name = "Saddle Brown",     id = 98 },
                  { name = "Moss Brown",       id = 100 },
                  { name = "Woodbeech Brown",  id = 102 },
                  { name = "Straw Brown",      id = 99 },
                  { name = "Sandy Brown",      id = 105 },
                  { name = "Bleached Brown",   id = 106 },
                  { name = "Schafter Purple",  id = 71 },
                  { name = "Spinnaker Purple", id = 72 },
                  { name = "Midnight Purple",  id = 142 },
                  { name = "Bright Purple",    id = 145 },
                  { name = "Cream",            id = 107 },
                  { name = "Ice White",        id = 111 },
                  { name = "Frost White",      id = 112 }
            }
      },
      {
            category = "metallic",
            label = Locale("Metallic"),
            id = 1,
            colors = { { name = "Black", id = 0 },
                  { name = "Carbon Black",     id = 147 },
                  { name = "Graphite",         id = 1 },
                  { name = "Anhracite Black",  id = 11 },
                  { name = "Black Steel",      id = 11 },
                  { name = "Dark Steel",       id = 3 },
                  { name = "Silver",           id = 4 },
                  { name = "Bluish Silver",    id = 5 },
                  { name = "Rolled Steel",     id = 6 },
                  { name = "Shadow Silver",    id = 7 },
                  { name = "Stone Silver",     id = 8 },
                  { name = "Midnight Silver",  id = 9 },
                  { name = "Cast Iron Silver", id = 10 },
                  { name = "Red",              id = 27 },
                  { name = "Torino Red",       id = 28 },
                  { name = "Formula Red",      id = 29 },
                  { name = "Lava Red",         id = 150 },
                  { name = "Blaze Red",        id = 30 },
                  { name = "Grace Red",        id = 31 },
                  { name = "Garnet Red",       id = 32 },
                  { name = "Sunset Red",       id = 33 },
                  { name = "Cabernet Red",     id = 34 },
                  { name = "Wine Red",         id = 143 },
                  { name = "Candy Red",        id = 35 },
                  { name = "Hot Pink",         id = 135 },
                  { name = "Pfsiter Pink",     id = 137 },
                  { name = "Salmon Pink",      id = 136 },
                  { name = "Sunrise Orange",   id = 36 },
                  { name = "Orange",           id = 38 },
                  { name = "Bright Orange",    id = 138 },
                  { name = "Gold",             id = 99 },
                  { name = "Bronze",           id = 90 },
                  { name = "Yellow",           id = 88 },
                  { name = "Race Yellow",      id = 89 },
                  { name = "Dew Yellow",       id = 91 },
                  { name = "Dark Green",       id = 49 },
                  { name = "Racing Green",     id = 50 },
                  { name = "Sea Green",        id = 51 },
                  { name = "Olive Green",      id = 52 },
                  { name = "Bright Green",     id = 53 },
                  { name = "Gasoline Green",   id = 54 },
                  { name = "Lime Green",       id = 92 },
                  { name = "Midnight Blue",    id = 141 },
                  { name = "Galaxy Blue",      id = 61 },
                  { name = "Dark Blue",        id = 62 },
                  { name = "Saxon Blue",       id = 63 },
                  { name = "Blue",             id = 64 },
                  { name = "Mariner Blue",     id = 65 },
                  { name = "Harbor Blue",      id = 66 },
                  { name = "Diamond Blue",     id = 67 },
                  { name = "Surf Blue",        id = 68 },
                  { name = "Nautical Blue",    id = 69 },
                  { name = "Racing Blue",      id = 73 },
                  { name = "Ultra Blue",       id = 70 },
                  { name = "Light Blue",       id = 74 },
                  { name = "Chocolate Brown",  id = 96 },
                  { name = "Bison Brown",      id = 101 },
                  { name = "Creeen Brown",     id = 95 },
                  { name = "Feltzer Brown",    id = 94 },
                  { name = "Maple Brown",      id = 97 },
                  { name = "Beechwood Brown",  id = 103 },
                  { name = "Sienna Brown",     id = 104 },
                  { name = "Saddle Brown",     id = 98 },
                  { name = "Moss Brown",       id = 100 },
                  { name = "Woodbeech Brown",  id = 102 },
                  { name = "Straw Brown",      id = 99 },
                  { name = "Sandy Brown",      id = 105 },
                  { name = "Bleached Brown",   id = 106 },
                  { name = "Schafter Purple",  id = 71 },
                  { name = "Spinnaker Purple", id = 72 },
                  { name = "Midnight Purple",  id = 142 },
                  { name = "Bright Purple",    id = 145 },
                  { name = "Cream",            id = 107 },
                  { name = "Ice White",        id = 111 },
                  { name = "Frost White",      id = 112 }
            }
      },
      {
            category = "matte",
            label = Locale("Matte"),
            id = 2,
            colors = { { name = "Black", id = 12 },
                  { name = "Gray",            id = 13 },
                  { name = "Light Gray",      id = 14 },
                  { name = "Ice White",       id = 131 },
                  { name = "Blue",            id = 83 },
                  { name = "Dark Blue",       id = 82 },
                  { name = "Midnight Blue",   id = 84 },
                  { name = "Midnight Purple", id = 149 },
                  { name = "Schafter Purple", id = 148 },
                  { name = "Red",             id = 39 },
                  { name = "Dark Red",        id = 40 },
                  { name = "Orange",          id = 41 },
                  { name = "Yellow",          id = 42 },
                  { name = "Lime Green",      id = 55 },
                  { name = "Green",           id = 128 },
                  { name = "Forest Green",    id = 151 },
                  { name = "Foliage Green",   id = 155 },
                  { name = "Olive Darb",      id = 152 },
                  { name = "Dark Earth",      id = 153 },
                  { name = "Desert Tan",      id = 154 }
            }
      },
      {
            category = "metals",
            label = Locale("Metals"),
            id = 3,
            colors = {
                  { name = "Brushed Steel",       id = 117 },
                  { name = "Brushed Black Steel", id = 118 },
                  { name = "Brushed Aluminium",   id = 119 },
                  { name = "Pure Gold",           id = 158 },
                  { name = "Brushed Gold",        id = 159 },
                  { name = "Chrome",              id = 120 }
            }
      }
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to sv_utils.lua, line 3

Config.BotName = 'ServerName'       -- Write the desired bot name

Config.ServerName = 'ServerName'    -- Write your server's name

Config.IconURL = ''                 -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.WebhookColor = '65352'
```

{% endtab %}
{% endtabs %}


# okokGarage

[**YouTube Video**](https://www.youtube.com/watch?v=yEq9wxSNGj0)

## **Installation Guide**

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokgarage_pgarages` (
    `garagename` VARCHAR(250) NULL DEFAULT NULL,
    `coords` VARCHAR(250) NULL DEFAULT NULL,
    `type` VARCHAR(50) NULL DEFAULT NULL,
    `owners` VARCHAR(250) NULL DEFAULT NULL
);

CREATE TABLE `okokgarage_companies` (
    `company_name` VARCHAR(50) NOT NULL,
    `owner` VARCHAR(255) NULL DEFAULT NULL,
    `owner_name` VARCHAR(50) NULL DEFAULT NULL,
    `money` INT(11) NULL DEFAULT NULL,
    `employees` LONGTEXT NULL DEFAULT NULL,
    `total_sales` INT(11) NULL DEFAULT NULL,
    `sales_history` LONGTEXT NULL DEFAULT NULL,
    CONSTRAINT `employees` CHECK (json_valid(`employees`))
);

CREATE TABLE `okokgarage_sharedgarages` (
    `owner` VARCHAR(255) NULL DEFAULT NULL,
    `ownername` VARCHAR(50) NULL DEFAULT NULL,
    `sharedwith` LONGTEXT NULL DEFAULT NULL
);
```

**ESX**

```sql
ALTER TABLE `owned_vehicles`
    ADD COLUMN `parking` VARCHAR(60) NULL DEFAULT NULL,
    ADD COLUMN `doorcondition` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `windowcondition` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `tyrecondition` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `favourite` TINYINT(1) NULL DEFAULT 0,
    ADD COLUMN `impoundTime` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `location` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `reason` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `sharedwith` LONGTEXT NULL DEFAULT '[]',
    ADD COLUMN `vehiclename` varchar(23) NULL DEFAULT NULL
;
```

**QBCore**

```sql
ALTER TABLE `player_vehicles`
    ADD COLUMN `parking` VARCHAR(60) NULL DEFAULT NULL,
    ADD COLUMN `doorcondition` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `windowcondition` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `tyrecondition` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `favourite` TINYINT(1) NULL DEFAULT 0,
    ADD COLUMN `impoundTime` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `location` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `reason` VARCHAR(255) NULL DEFAULT NULL,
    ADD COLUMN `sharedwith` LONGTEXT NULL DEFAULT '[]',
    ADD COLUMN `vehiclename` varchar(23) NULL DEFAULT NULL
;
```

### Vehicle Keys

{% tabs %}
{% tab title="Client" %}

```lua
TriggerServerEvent("okokGarage:GiveKeys", plate)
TriggerServerEvent("okokGarage:RemoveKeys", plate, source)
```

{% endtab %}

{% tab title="Server" %}

```lua
TriggerEvent("okokGarage:GiveKeys", plate)
TriggerEvent("okokGarage:RemoveKeys", plate, source)
```

{% endtab %}
{% endtabs %}

### Stolen Vehicle

Once triggered, the only way for a player to recover their vehicle is to go to the police station and pay to get the vehicle back in their garage.

```lua
TriggerServerEvent("okokGarage:setVehicleStolen", plate)
```

### Adding vehicle images

To add images to the vehicles, simply drop them in the **web/img/vehicles** folder with the **same id** as the vehicle (the images should be in the **PNG** format).

### Set the Discord Webhook URL (to enable logs)

Navigate to the `sv_utils.lua` file and paste the webhook URL in the line 3.

[How to create a Discord Webhook URL](https://ahsda89sgdh18923asd.gitbook.io/main/others/discord-webhook)

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Debug = false

Config.Locale = 'en' -- en / pt / gr / fr / de / es

Config.EventPrefix = "okokGarage"

Config.ESXPrefix = "esx"

Config.onPlayerDeath = "onPlayerDeath"

Config.playerLoaded = "playerLoaded"

Config.getSharedObject = "getSharedObject"

Config.getDeathStatus = "esx_ambulancejob:getDeathStatus" -- Should be a callback that returns a variable that is true if dead, false if alive

Config.FuelResource = "native" -- "nothing" - no fuel resource, "native" - will use the FiveM natives, "legacyfuel", "ox_fuel"

Config.CameraEnabled = true -- Camera animation when taking out a vehicle

Config.ImageType = "default" -- "default" - each vehicle uses a unique image (e.g. Zentorno - zentorno.png), "type" - each vehicle type uses an image (e.g. Zentorno - car.png), "single" - all vehicles use the same image (e.g. Zentorno - vehicle.png)

Config.vImageCreator = false -- If true, it'll use vImageCreator

Config.GetVehicleAnywhere = true -- You can get your vehicle from all garages even if you didn't store it there

Config.GetVehicleModelName = true -- If true, it'll get the vehicle model name instead of the vehicle name

Config.CameraAnimationTime = 2 -- Camera animation time in seconds

Config.CameraOffsetHeight = 10 -- The height of the vehicle camera after taking it out

Config.ShakeAmplitude = 0.0 -- Camera shake when viewing a vehicle (0.2 to be like in okokVehicleShop)

Config.InteractionKey = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.UseOkokVehicleKeys = true
Config.LockVehicle = "U" -- This is used to allow custom keybinds that players can change in their settings
Config.LockVehicleCommand = "lockvehicle"
Config.LockVehicleDescription = "Used to lock/unlock vehicle"
Config.LockVehicleAudioVolume = 0.3 -- (0.0 - 1.0)
Config.VehicleRadius = 20.0 -- This is the radius used to check if the player is close enough to lock/unlock vehicle

Config.SaveWithKey = true -- If true, players with the vehicle key can store the vehicle. The vehicle will then be stored in the owner's garage.

Config.GiveKeysCommand = "givekeys"
Config.GiveKeysRadius = 7.5

Config.UseOkokTextUI = true
Config.UseOkOkNotify = true
Config.UseOkOkRequests = true
Config.UseOkOkBanking = true -- For transactions logs

Config.HideMinimap = true

Config.ShowBlips = true

Config.SetIntoVehicle = true -- If true, it'll teleport the player into the vehicle

Config.ShowGaragesBlipCommand = "garageblips"
Config.ShowGaragesBlip = true

Config.StoreOwnedVehiclesOnly = true -- If true, players will only be able to store vehicles they own, if false, they will be able to store any vehicle

Config.StoreVehicleFade = true -- If true, the vehicle will fade out

Config.ShowVehicleImpoundedWhenExists = true -- If true, the vehicle will be available to take out of the impound even when he's spawned in the map

Config.VehicleImpoundedOnDV = true -- If true, the vehicle will be set as impounded when he gets deleted

Config.SetVehicleImpoundAfter = 300 -- How many seconds after taking out the vehicle does it take to set as impounded
Config.CheckInterval = 60 -- How often it'll check for non existing vehicles

Config.ChangeVehicleStateOnStart = true -- If true, vehicle will be set to stored or impounded (Config.SetVehiclesImpoundedOnStart)
Config.SetVehiclesImpoundedOnStart = true -- If true, outside vehicles will be set as impounded on start, if false, they'll be set as stored

Config.UseOkokVehicleSales = false -- If true, If a vehicle is in display he won't show in the impound
Config.okokVehicleSalesName = "okokVehicleSales" -- Name of the vehicle sales script

Config.KeyMetaData = { -- Items will be used instead of the "U" key to lock/unlock vehicles. (Only ox-inventory supported at the moment - if you use another inventory with metadata and would like support to it to be added, please let us know through the tickets)
	inventoryResourceName = "ox_inventory",
	keyItemName = "keys",
	oxInventory = false,
	quasarInventory = false,
	coreInventory = false,
}

Config.HousingSystems = {
	quasarHousing = false,
	esxProperty = false,
}

Config.ImpoundCommand = "impound"
Config.ImpoundJobs = {"police", "mechanics"} -- Jobs that can impound vehicles
Config.ImpoundDistance = 5.0 -- Max distance you can impound from
Config.ImpoundTimes = {"2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24"} -- Hours

Config.GlobalImpound = true -- If true, a vehicle can be taken from any impound
Config.PayToImpound = true -- Enable this if a player should be able to skip the impound time by paying.
Config.PayToImpoundFee = 300 -- This is per hour that the player gets their vehicle early
Config.RetrieveFeeEnabled = false -- If enabled, players will have to pay a one time fee when retrieving their vehicle after the timer has finished.
Config.RetrieveFee = 500 -- One time payment once vehicle is retrieved.

Config.AdminGroups = { -- Groups allowed to remove all the vehicles from the impound/give vehicle/remove vehicle/give key
	"admin", 
	"superadmin"
} 
Config.RemoveAllImpoundedVehiclesCommand = "removeallimpoundedvehicles"
Config.GiveVehicle = "givevehicle"
Config.RemoveVehicle = "removevehicle"
Config.GiveKeys = "adminkeys" -- Has to be different to Config.GiveKeysCommand
Config.AdminMenu = "gadmin"

Config.PlateLetters = 3 -- How many letters the plate has (Used when adding a vehicle)
Config.PlateUseSpace = true
Config.PlateNumbers = 3 -- How many numbers the plate has (Used when adding a vehicle)

Config.RandomPlateSociety = false -- If true, will generate a plate for vehicles in infinite garage

Config.CreateGarageCommand = "creategarage"

Config.SellGarageCommand = "sellgarage"
Config.SellGarageRadius = 3.0
Config.SellerComission = 5 -- In percent (%)
Config.RenewalPrice = 500
Config.RenewalIntervals = 7 -- In real life days

Config.MaxPrivateGaragesPerPlayer = 3

-- Used to show the vehicle properties in the view menu
Config.UseKMh = true
Config.MaxSpeedValue = 300
Config.MaxAcceleration = 0.6
Config.MaxBraking = 1.6
Config.MaxHandling = 10

Config.ViewCameraAngle = -60
Config.ViewCameraDistance = 5.5
Config.ViewCameraHeight = 2.0

Config.AllowRepair = true -- If a player can repair the vehicle when viewing the vehicle
Config.RepairPrice = 1000

Config.TakeOutAtView = true -- When taking the vehicle out via the view menu it'll spawn in the same location as the view vehicle

Config.LiveriesAndExtrasCommand = "liveries"
Config.AccessLiveriesExtrasJobs = { -- Add 'all' so everyone can access this menu
	'police',
	'ambulance'
}

-- COMPANY 
Config.MaxEmployees = 7
Config.JobRanks = { -- These are the ranks available on the vehicle shops, you can add or remove as many as you want but leave at least 1. Don't add owner as this is automatically added.
	["Newbie"] = {id = 1, coOwner = false},			-- ID: 1
	["Experienced"] = {id = 2, coOwner = false},	-- ID: 2
	["Expert"] = {id = 3, coOwner = false},			-- ID: 3
	["Sub-Owner"] = {id = 4, coOwner = true}		-- ID: 4 
}

Config.PrivateGarages = {
	blip = { blipId = 524, blipColor = 2, blipScale = 0.9, blipText = "Private Garage For Sale" },
	ownedBlip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Owned Private Garage"},
	ownedMarker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
	storeVehicleMarker = {id = 36, color = {r = 255, g = 0, b = 0, a = 90}, size = {x = 1.25, y = 1.25, z = 1.25}, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
	radius = 1
}

Config.HireEmployeeRadius = 15.0

Config.SellBusinessReceivePercentage = 50 -- How much a player will receive for selling his business (in percentage, 50 = 50%)

Config.Companies = {
	["Garage Shop"]	= {
		coords = vec3(112.28, -630.06, 44.23),
		ownerCoords = vec3(112.28, -630.06, 44.23),
		radius = 1,
		price = 12000,
		ownerBlip = {blipId = 475, blipColor = 38, blipScale = 0.9, blipText = "Owner Panel"},
		unownedOwnerBlip = {blipId = 476, blipColor = 2, blipScale = 0.9, blipText = "Unowned Company"},
		ownerMarker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
		UnownedMarker = {id = 21, color = {r = 0, g = 255, b = 0, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
	},--[[
	["Garage Shop 2"]	= {
		coords = vector3(-949.5,-2946.55,13.95),
		ownerCoords = vector3(-949.5,-2946.55,13.95),
		radius = 1,
		price = 12000,
		ownerBlip = {blipId = 475, blipColor = 38, blipScale = 0.9, blipText = "Owner Panel"},
		unownedOwnerBlip = {blipId = 476, blipColor = 2, blipScale = 0.9, blipText = "Unowned Company"},
		ownerMarker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
		UnownedMarker = {id = 21, color = {r = 0, g = 255, b = 0, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
	},]]
}

Config.SocietyVehiclesList = {
	['police'] = { -- Society in lowercase
		{
			vehicleModel = 'police',
			plate = 'POLICE',
			minimumGrade = 1,
			livery = 4,
			armor = 4,
			brakes = 2,
			engine = 3,
			suspension = 3,
			transmission = 2,
			turbo = true,
			type = "car"
		},
		{
			vehicleModel = 'Police2',
			plate = 'POLICE',
			minimumGrade = 1,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
		{
			vehicleModel = 'riot',
			plate = 'POLICE',
			minimumGrade = 3,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
		{
			vehicleModel = 'sheriff2',
			plate = 'POLICE',
			minimumGrade = 3,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
		{
			vehicleModel = 'pbus',
			plate = 'POLICE',
			minimumGrade = 3,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
	},
}

Config.Garages = { -- Garages list/info
	{
		name = "Legion Square", -- Garage name shown in the menu
		coords = vector3(215.66, -809.93, 30.73), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(214.32, -793.27, 30.8),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(233.12, -789.94, 30.6, 160.55),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(222.16, -804.25, 30.58, 250.0), -- Make it work with multiple spawn points
			vector4(223.46, -799.04, 30.58, 250.0),
			vector4(226.3, -791.58, 30.58, 250.0),
			vector4(215.43, -775.99, 30.43, 248.98),
			vector4(232.69, -773.72, 30.32, 249.76)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "legion", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Alta", -- Garage name shown in the menu
		coords = vector3(278.19, -345.95, 44.92), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(294.05, -340.45, 44.92),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(233.12, -789.94, 30.6, 160.55),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(266.84, -328.77, 44.5, 249.42), -- Make it work with multiple spawn points
			vector4(269.29, -322.26, 44.5, 249.45),
			vector4(287.66, -329.12, 44.5, 249.52),
			vector4(283.91, -338.77, 44.5, 249.58),
			vector4(294.68, -346.56, 44.5, 69.93)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "alta", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Textile City", -- Garage name shown in the menu
		coords = vector3(412.74, -634.35, 28.5), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(402.15, -643.13, 28.5),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(423.51, -642.01, 28.08, 179.08),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(408.8, -638.68, 28.08, 270.0), -- Make it work with multiple spawn points
			vector4(393.08, -638.73, 28.08, 270.81),
			vector4(393.21, -649.69, 28.08, 270.43),
			vector4(392.48, -657.72, 28.08, 270.83),
			vector4(415.9, -649.35, 28.08, 270.51)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "textilecity", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Pillbox Hill", -- Garage name shown in the menu
		coords = vector3(-332.01, -781.39, 33.96), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-331.93, -768.52, 33.97),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-348.88, -775.52, 33.54, 359.15),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-320.15, -752.3, 33.54, 159.86), -- Make it work with multiple spawn points
			vector4(-331.77, -750.56, 33.54, 181.7),
			vector4(-341.29, -756.81, 33.54, 91.4),
			vector4(-357.49, -764.41, 33.54, 269.31),
			vector4(-307.79, -756.62, 33.54, 161.04)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "pillboxhill", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "West Vinewood", -- Garage name shown in the menu
		coords = vector3(-515.93, 53.0, 52.58), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-529.11, 48.59, 52.58),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-524.62, 37.15, 52.16, 355.19),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-537.01, 40.77, 52.16, 265.99), -- Make it work with multiple spawn points
			vector4(-509.52, 65.48, 52.16, 85.36),
			vector4(-510.96, 55.17, 52.16, 84.34),
			vector4(-519.69, 66.28, 52.16, 84.99),
			vector4(-504.47, 54.48, 56.07, 265.69)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "westvinewood", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "West Vinewood 2", -- Garage name shown in the menu
		coords = vector3(-570.24, 311.83, 84.49), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-561.5, 328.39, 84.41),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-579.38, 330.2, 84.34, 264.51),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-580.68, 314.45, 84.37, 354.67), -- Make it work with multiple spawn points
			vector4(-588.58, 335.45, 84.67, 175.84),
			vector4(-601.55, 345.46, 84.69, 175.98)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "westvinewood2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Vinewood Hills", -- Garage name shown in the menu
		coords = vector3(886.2, -1.13, 78.76), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(878.34, -10.78, 78.76),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(870.99, -22.5, 78.34, 147.82),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(858.37, -28.97, 78.34, 237.92), -- Make it work with multiple spawn points
			vector4(865.02, -45.35, 78.34, 57.82),
			vector4(890.62, -45.15, 78.34, 57.29)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "vinewoodhills", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Vinewood Hills 2", -- Garage name shown in the menu
		coords = vector3(664.45, 630.94, 128.91), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(655.81, 631.84, 128.91),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(650.71, 617.75, 128.49, 159.21),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(638.47, 606.27, 128.49, 250.49), -- Make it work with multiple spawn points
			vector4(654.98, 606.79, 128.49, 71.33),
			vector4(636.39, 625.62, 128.49, 70.06)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "vinewoodhills2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Vinewood Hills 3", -- Garage name shown in the menu
		coords = vector3(-77.07, 907.36, 235.81), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-75.47, 895.6, 235.5),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-76.79, 894.18, 235.19, 29.7),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-66.23, 892.11, 235.13, 115.63), -- Make it work with multiple spawn points
			vector4(-71.02, 903.26, 235.19, 114.49)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "vinewoodhills3", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Harmony", -- Garage name shown in the menu
		coords = vector3(599.73, 2726.74, 41.91), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(593.19, 2730.84, 42.02),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(612.4, 2731.64, 41.55, 274.05),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(624.26, 2724.0, 41.4, 5.26), -- Make it work with multiple spawn points
			vector4(583.25, 2736.76, 41.58, 184.15),
			vector4(581.21, 2720.36, 41.64, 4.71)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "harmony", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Banham Canyon", -- Garage name shown in the menu
		coords = vector3(-3048.89, 611.0, 7.18), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-3041.26, 607.11, 7.5),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-3040.33, 601.09, 7.15, 290.33),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-3056.03, 608.34, 6.79, 291.97), -- Make it work with multiple spawn points
			vector4(-3053.88, 602.67, 6.87, 289.86),
			vector4(-3051.78, 596.95, 7.02, 289.15)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "banhamcanyon", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Downtown Vinewood", -- Garage name shown in the menu
		coords = vector3(364.39, 297.84, 103.49), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(372.99, 289.74, 103.27),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(362.74, 280.75, 102.89, 189.33),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(386.95, 291.72, 102.63, 165.04), -- Make it work with multiple spawn points
			vector4(392.69, 280.48, 102.56, 71.03),
			vector4(371.48, 266.74, 102.6, 340.53)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "downtownvinewood", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Grand Senora", -- Garage name shown in the menu
		coords = vector3(1984.54, 3065.77, 47.01), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1990.1, 3070.05, 47.0),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(2006.03, 3071.98, 46.63, 59.49),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(2012.04, 3055.3, 46.62, 58.94), -- Make it work with multiple spawn points
			vector4(2016.86, 3062.81, 46.62, 60.09),
			vector4(1999.63, 3081.81, 46.65, 148.07)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "grandsenora", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Sandy Shores MC", -- Garage name shown in the menu
		coords = vector3(1836.58, 3668.21, 33.68), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1844.66, 3663.68, 34.15),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1836.34, 3656.15, 33.85, 118.6),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1853.67, 3676.2, 33.33, 210.23), -- Make it work with multiple spawn points
			vector4(1831.35, 3663.51, 33.44, 210.09),
			vector4(1825.11, 3659.53, 33.58, 209.13)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "sandyshoresmc", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "San Chianski", -- Garage name shown in the menu
		coords = vector3(2761.43, 3452.49, 55.84), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(2750.55, 3445.04, 56.1),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(2777.97, 3462.32, 55.06, 158.35),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(2775.86, 3436.56, 55.39, 67.43), -- Make it work with multiple spawn points
			vector4(2791.24, 3474.5, 54.85, 68.56),
			vector4(2769.44, 3473.51, 55.08, 67.23)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "sanchianski", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Mirror Park", -- Garage name shown in the menu
		coords = vector3(1034.69, -766.03, 58.0), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1025.51, -759.96, 57.99),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1022.15, -771.78, 57.6, 225.44),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1017.16, -760.3, 57.55, 222.93), -- Make it work with multiple spawn points
			vector4(1027.52, -785.35, 57.45, 310.28),
			vector4(1047.0, -785.62, 57.57, 91.26)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "mirrorpark", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "La Puerta", -- Garage name shown in the menu
		coords = vector3(-1082.51, -1261.67, 5.61), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1065.57, -1261.42, 6.01),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-1078.22, -1246.83, 4.84, 215.33),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1075.61, -1267.34, 5.48, 299.93), -- Make it work with multiple spawn points
			vector4(-1080.98, -1258.0, 5.13, 300.38),
			vector4(-1074.83, -1240.87, 4.85, 120.24)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "lapuerta", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Paleto Bay", -- Garage name shown in the menu
		coords = vector3(137.66, 6612.97, 31.83), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(147.58, 6622.93, 31.77),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(129.92, 6607.48, 31.42, 219.53),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(151.05, 6607.28, 31.45, 358.41), -- Make it work with multiple spawn points
			vector4(145.84, 6613.57, 31.39, 359.11),
			vector4(155.75, 6592.76, 31.42, 179.37)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "paletobay", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Paleto Bay 2", -- Garage name shown in the menu
		coords = vector3(-274.94, 6126.03, 31.48), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-280.27, 6120.74, 31.51),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-292.71, 6132.29, 31.08, 206.07),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-282.03, 6142.62, 31.08, 135.25), -- Make it work with multiple spawn points
			vector4(-276.61, 6137.28, 31.08, 135.7),
			vector4(-303.97, 6129.09, 31.08, 225.36)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "paletobay2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Rancho", -- Garage name shown in the menu
		coords = vector3(384.21, -1612.76, 29.29), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(397.2, -1613.16, 29.29),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(385.8, -1622.36, 28.87, 308.69),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(395.51, -1626.53, 28.87, 49.3), -- Make it work with multiple spawn points
			vector4(388.55, -1612.64, 28.87, 230.57)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "rancho", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Rancho 2", -- Garage name shown in the menu
		coords = vector3(443.0, -1969.08, 24.4), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(457.17, -1977.47, 22.96),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(464.89, -1990.1, 22.55, 130.05),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(453.99, -1965.92, 22.55, 180.38), -- Make it work with multiple spawn points
			vector4(449.5, -1960.62, 22.55, 182.45)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "rancho2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Del Perro", -- Garage name shown in the menu
		coords = vector3(-1523.96, -451.46, 35.6), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1519.72, -445.65, 35.44),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-1524.46, -434.02, 35.02, 207.58),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1522.3, -418.57, 35.02, 230.52), -- Make it work with multiple spawn points
			vector4(-1526.95, -423.81, 35.02, 230.73)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "delperro", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Davis", -- Garage name shown in the menu
		coords = vector3(-71.77, -1821.7, 26.94), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-50.89, -1831.68, 26.57),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-65.56, -1833.55, 26.45, 253.19),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-60.26, -1843.13, 26.16, 319.89), -- Make it work with multiple spawn points
			vector4(-52.36, -1849.82, 25.85, 320.93)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "davis", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Grapeseed", -- Garage name shown in the menu
		coords = vector3(1698.05, 4792.72, 41.92), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1691.35, 4794.65, 41.92),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1708.66, 4802.96, 41.36, 90.87),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1691.42, 4788.03, 41.5, 89.22), -- Make it work with multiple spawn points
			vector4(1691.61, 4774.13, 41.5, 91.71)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "grapeseed", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Mount Chiliad", -- Garage name shown in the menu
		coords = vector3(1721.4, 6410.46, 34.01), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1722.91, 6394.3, 34.24),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1734.67, 6398.26, 34.49, 92.25),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1729.74, 6405.79, 34.04, 152.75), -- Make it work with multiple spawn points
			vector4(1717.45, 6416.34, 33.02, 243.98)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "mountchiliad", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Zancudo River", -- Garage name shown in the menu
		coords = vector3(-1130.62, 2675.25, 18.18), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1136.76, 2669.33, 18.1),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-1153.04, 2661.34, 17.67, 221.45),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1159.62, 2673.95, 17.67, 222.74), -- Make it work with multiple spawn points
			vector4(-1154.93, 2678.09, 17.67, 220.94)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "zancudoriver", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Tataviam Mountains", -- Garage name shown in the menu
		coords = vector3(2588.15, 426.63, 108.55), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(2570.9, 416.1, 108.46),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(2578.66, 403.31, 108.03, 238.04),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(2576.07, 428.77, 108.03, 180.28), -- Make it work with multiple spawn points
			vector4(2583.07, 428.63, 108.03, 179.74)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "tataviammountains", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "LS Airport", -- Garage name shown in the menu
		coords = vector3(-949.49, -2582.63, 13.83), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-948.02, -2589.07, 13.83),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-959.68, -2594.74, 13.42, 129.07),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-957.98, -2604.35, 13.42, 60.79), -- Make it work with multiple spawn points
			vector4(-957.04, -2583.48, 13.41, 240.27)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "lsairport", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	-- Boats
	{
		name = "Boat", -- Garage name shown in the menu
		coords = vector3(-726.15, -1333.12, 1.6), -- Marker position
		blip = { blipId = 410, blipColor = 3, blipScale = 0.9, blipText = "Boat Garage" }, -- Blip informations
		marker = { id = 35, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 2, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-747.33, -1356.48, 1.1),
		storeVehicleMarker = {id = 35, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 1.0, y = 1.0, z = 1.0 }, radius = 4.0, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-722.91, -1352.47, 0.12, 128.26),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-704.71, -1341.66, -0.09, 134.81), -- Make it work with multiple spawn points
			vector4(-711.88, -1329.8, 0.43, 142.34),

		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "boat", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "boat" -- car, air or boat
	},
	-- Airplanes
	{
		name = "Air", -- Garage name shown in the menu
		coords = vector3(-943.03, -2962.05, 13.95), -- Marker position
		blip = { blipId = 43, blipColor = 3, blipScale = 0.9, blipText = "Air Garage" }, -- Blip informations
		marker = { id = 34, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 5, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1007.54, -2979.84, 13.95),
		storeVehicleMarker = {id = 34, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 1.25, y = 1.25, z = 1.25 }, radius = 5.0, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-979.32, -2997.89, 13.95, 59.19),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1007.13, -3015.86, 13.95, 55.89), -- Make it work with multiple spawn points
			vector4(-979.32, -2997.89, 13.95, 59.19),
			vector4(-960.99, -2964.56, 13.95, 57.96)

		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "air", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "air" -- car, air or boat
	},
	{
		name = "LSPD", -- Garage name shown in the menu
		coords = vector3(456.05, -1020.52, 28.28), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Police Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(452.69, -1013.04, 28.47),
		storeVehicleMarker = {id = 36, color = {r = 255, g = 0, b = 0, a = 90}, size = {x = 1.25, y = 1.25, z = 1.25}, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(233.12, -789.94, 30.6, 160.55),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(446.43, -1025.51, 28.64, 360.0), -- Make it work with multiple spawn points
			vector4(442.97, -1026.19, 28.71, 360.0),
			vector4(438.99, -1026.51, 28.78, 360.0),
			vector4(435.43, -1027.24, 28.84, 360.0),
			vector4(431.69, -1027.66, 28.91, 360.0),
			vector4(427.49, -1028.11, 28.99, 360.0)
		},
		infiniteVehicles = true, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "police1", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "police", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
}

Config.Impound = { -- Garages list/info
	{
		name = "LS Impound", -- Garage name shown in the menu
		coords = vector3(409.57, -1623.24, 29.29), -- Marker position
		blip = { blipId = 524, blipColor = 5, blipScale = 0.9, blipText = "Impound" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		type = "car", -- type of vehicle to appear in the impound menu ("" = all)
		vehicleSpawn = { -- Where the vehicle spawns when you recover it
			vector4(396.0, -1644.6, 29.29, 140.0), -- Make it work with multiple spawn points
			vector4(398.4, -1646.6, 29.29, 140.0),
			vector4(400.8, -1648.6, 29.29, 140.0),
			vector4(403.2, -1650.6, 29.29, 140.0),
			vector4(405.6, -1652.6, 29.29, 140.0),
			vector4(408.0, -1654.6, 29.29, 140.0),
			vector4(410.4, -1656.6, 29.29, 140.0),
			vector4(417.1, -1627.8, 29.29, 320.0)
		},
	},
	{
		name = "PB Impound", -- Garage name shown in the menu
		coords = vector3(-270.15, 6130.77, 31.51), -- Marker position
		blip = { blipId = 524, blipColor = 5, blipScale = 0.9, blipText = "Impound" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		type = "", -- type of vehicle to appear in the impound menu ("" = all)
		vehicleSpawn = { -- Where the vehicle spawns when you recover it
			vector4(-282.03, 6142.62, 31.08, 135.25), -- Make it work with multiple spawn points
			vector4(-276.61, 6137.28, 31.08, 135.7),
			vector4(-303.97, 6129.09, 31.08, 225.36)
		},
	},
}

Config.UseRecoverStolenVehicles = true

Config.RecoverVehiclePrice = 500

Config.RecoverVehicle = {
	{
		name = "LSPD Recover", -- Garage name shown in the menu
		coords = vector3(437.76, -979.36, 30.69), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Recover Vehicle" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		vehicleSpawn = { -- Where the vehicle spawns when you recover it
			vector4(407.77, -979.66, 29.27, 231.52), -- Make it work with multiple spawn points
			vector4(407.3, -984.0, 29.27, 231.52),
			vector4(407.78, -988.8, 29.27, 231.52),
			vector4(407.82, -993.31, 29.27, 231.52),
			vector4(407.78, -997.91, 29.27, 231.52),
			vector4(402.9, -996.1, 29.36, 360.0),
			vector4(403.0, -987.17, 29.36, 360.0),
			vector4(403.0, -978.17, 29.36, 360.0)
		},
	},
}


-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to sv_utils.lua, line 3

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.StoreVehicleWebhookColor = '65352'

Config.TakeOutVehicleWebhookColor = '16711680'

Config.ShareWebhookColor = '16127'

Config.TransferWebhookColor = '16776960'

Config.CompanyWebhookColor = '7100555'

-------------------------- LOCALES (DON'T TOUCH)

function _L(id) 
	if Locales[Config.Locale][id] then 
		return Locales[Config.Locale][id] 
	else 
		print("Locale '"..id.."' doesn't exist") 
	end 
end

-- V1.3.5
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config = {}

Locales = {}

Config.Debug = false

Config.Locale = 'en' -- en / pt / gr / fr / de / es

Config.EventPrefix = "okokGarage"

Config.QBCorePrefix = "qb"

Config.onPlayerDeath = "onPlayerDeath"

Config.playerLoaded = "playerLoaded"

Config.getSharedObject = "getSharedObject"

Config.FuelResource = "native" -- "nothing" - no fuel resource, "native" - will use the FiveM natives, "legacyfuel", "ox_fuel"

Config.CameraEnabled = true -- Camera animation when taking out a vehicle

Config.ImageType = "default" -- "default" - each vehicle uses a unique image (e.g. Zentorno - zentorno.png), "type" - each vehicle type uses an image (e.g. Zentorno - car.png), "single" - all vehicles use the same image (e.g. Zentorno - vehicle.png)

Config.vImageCreator = false -- If true, it'll use vImageCreator

Config.GetVehicleAnywhere = true -- You can get your vehicle from all garages even if you didn't store it there

Config.GetVehicleModelName = true -- If true, it'll get the vehicle model name instead of the vehicle name

Config.CameraAnimationTime = 2 -- Camera animation time in seconds

Config.CameraOffsetHeight = 10 -- The height of the vehicle camera after taking it out

Config.ShakeAmplitude = 0.0 -- Camera shake when viewing a vehicle (0.2 to be like in okokVehicleShop)

Config.InteractionKey = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.UseOkokVehicleKeys = true
Config.LockVehicle = "U" -- This is used to allow custom keybinds that players can change in their settings
Config.LockVehicleCommand = "lockvehicle"
Config.LockVehicleDescription = "Used to lock/unlock vehicle"
Config.LockVehicleAudioVolume = 0.3 -- (0.0 - 1.0)
Config.VehicleRadius = 20.0 -- This is the radius used to check if the player is close enough to lock/unlock vehicle

Config.SaveWithKey = true -- If true, players with the vehicle key can store the vehicle. The vehicle will then be stored in the owner's garage.

Config.GiveKeysCommand = "givekeys"
Config.GiveKeysRadius = 7.5

Config.UseOkokTextUI = true
Config.UseOkOkNotify = true
Config.UseOkOkRequests = true
Config.UseOkOkBanking = true -- For transactions logs

Config.HideMinimap = true

Config.ShowBlips = true

Config.SetIntoVehicle = true -- If true, it'll teleport the player into the vehicle

Config.ShowGaragesBlipCommand = "garageblips"
Config.ShowGaragesBlip = true

Config.StoreOwnedVehiclesOnly = true -- If true, players will only be able to store vehicles they own, if false, they will be able to store any vehicle

Config.StoreVehicleFade = true -- If true, the vehicle will fade out

Config.ShowVehicleImpoundedWhenExists = true -- If true, the vehicle will be available to take out of the impound even when he's spawned in the map

Config.VehicleImpoundedOnDV = true -- If true, the vehicle will be set as impounded when he gets deleted

Config.SetVehicleImpoundAfter = 300 -- How many seconds after taking out the vehicle does it take to set as impounded
Config.CheckInterval = 60 -- How often it'll check for non existing vehicles

Config.ChangeVehicleStateOnStart = true -- If true, vehicle will be set to stored or impounded (Config.SetVehiclesImpoundedOnStart)
Config.SetVehiclesImpoundedOnStart = true -- If true, outside vehicles will be set as impounded on start, if false, they'll be set as stored

Config.UseOkokVehicleSales = false -- If true, If a vehicle is in display he won't show in the impound
Config.okokVehicleSalesName = "okokVehicleSales" -- Name of the vehicle sales script

Config.KeyMetaData = { -- Items will be used instead of the "U" key to lock/unlock vehicles. (Only ox-inventory supported at the moment - if you use another inventory with metadata and would like support to it to be added, please let us know through the tickets)
	inventoryResourceName = "ox_inventory",
	keyItemName = "keys",
	oxInventory = false,
	qbInventory = false,
	qsInventory = false,
	coreInventory = false,
}

Config.HousingSystems = {
	quasarHousing = true
}
Config.ImpoundCommand = "impound"
Config.ImpoundJobs = {"police", "mechanics"} -- Jobs that can impound vehicles
Config.ImpoundDistance = 5.0 -- Max distance you can impound from
Config.ImpoundTimes = {"2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24"} -- Hours

Config.GlobalImpound = true -- If true, a vehicle can be taken from any impound
Config.PayToImpound = true -- Enable this if a player should be able to skip the impound time by paying.
Config.PayToImpoundFee = 300 -- This is per hour that the player gets their vehicle early
Config.RetrieveFeeEnabled = false -- If enabled, players will have to pay a one time fee when retrieving their vehicle after the timer has finished.
Config.RetrieveFee = 500 -- One time payment once vehicle is retrieved.

Config.AdminGroups = { -- Groups allowed to remove all the vehicles from the impound/give vehicle/remove vehicle/give key
	"god",
	"admin", 
	"mod"
} 
Config.RemoveAllImpoundedVehiclesCommand = "removeallimpoundedvehicles"
Config.GiveVehicle = "givevehicle"
Config.RemoveVehicle = "removevehicle"
Config.GiveKeys = "adminkeys" -- Has to be different to Config.GiveKeysCommand
Config.AdminMenu = "gadmin"

Config.PlateLetters = 3 -- How many letters the plate has (Used when adding a vehicle)
Config.PlateUseSpace = true
Config.PlateNumbers = 3 -- How many numbers the plate has (Used when adding a vehicle)

Config.RandomPlateSociety = false -- If true, will generate a plate for vehicles in infinite garage

Config.CreateGarageCommand = "creategarage"

Config.SellGarageCommand = "sellgarage"
Config.SellGarageRadius = 3.0
Config.SellerComission = 5 -- In percent (%)
Config.RenewalPrice = 500
Config.RenewalIntervals = 7 -- In real life days

Config.MaxPrivateGaragesPerPlayer = 3

-- Used to show the vehicle properties in the view menu
Config.UseKMh = true
Config.MaxSpeedValue = 300
Config.MaxAcceleration = 0.6
Config.MaxBraking = 1.6
Config.MaxHandling = 10

Config.ViewCameraAngle = -60
Config.ViewCameraDistance = 5.5
Config.ViewCameraHeight = 2.0

Config.AllowRepair = true -- If a player can repair the vehicle when viewing the vehicle
Config.RepairPrice = 1000

Config.TakeOutAtView = true -- When taking the vehicle out via the view menu it'll spawn in the same location as the view vehicle

Config.LiveriesAndExtrasCommand = "liveries"
Config.AccessLiveriesExtrasJobs = { -- Add 'all' so everyone can access this menu
	'police',
	'ambulance'
}

-- COMPANY 
Config.MaxEmployees = 7
Config.JobRanks = { -- These are the ranks available on the vehicle shops, you can add or remove as many as you want but leave at least 1. Don't add owner as this is automatically added.
	["Newbie"] = {id = 1, coOwner = false},			-- ID: 1
	["Experienced"] = {id = 2, coOwner = false},	-- ID: 2
	["Expert"] = {id = 3, coOwner = false},			-- ID: 3
	["Sub-Owner"] = {id = 4, coOwner = true}		-- ID: 4 
}

Config.PrivateGarages = {
	blip = { blipId = 524, blipColor = 2, blipScale = 0.9, blipText = "Private Garage For Sale" },
	ownedBlip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Owned Private Garage"},
	ownedMarker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
	storeVehicleMarker = {id = 36, color = {r = 255, g = 0, b = 0, a = 90}, size = {x = 1.25, y = 1.25, z = 1.25}, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
	radius = 1
}

Config.HireEmployeeRadius = 15.0

Config.SellBusinessReceivePercentage = 50 -- How much a player will receive for selling his business (in percentage, 50 = 50%)

Config.Companies = {
	["Garage Shop"]	= {
		coords = vec3(112.28, -630.06, 44.23),
		ownerCoords = vec3(112.28, -630.06, 44.23),
		radius = 1,
		price = 12000,
		ownerBlip = {blipId = 475, blipColor = 38, blipScale = 0.9, blipText = "Owner Panel"},
		unownedOwnerBlip = {blipId = 476, blipColor = 2, blipScale = 0.9, blipText = "Unowned Company"},
		ownerMarker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
		UnownedMarker = {id = 21, color = {r = 0, g = 255, b = 0, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
	},--[[
	["Garage Shop 2"]	= {
		coords = vector3(-949.5,-2946.55,13.95),
		ownerCoords = vector3(-949.5,-2946.55,13.95),
		radius = 1,
		price = 12000,
		ownerBlip = {blipId = 475, blipColor = 38, blipScale = 0.9, blipText = "Owner Panel"},
		unownedOwnerBlip = {blipId = 476, blipColor = 2, blipScale = 0.9, blipText = "Unowned Company"},
		ownerMarker = {id = 21, color = {r = 31, g = 94, b = 255, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
		UnownedMarker = {id = 21, color = {r = 0, g = 255, b = 0, a = 90}, size = {x = 0.5, y = 0.5, z = 0.5}, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 },
	},]]
}

Config.SocietyVehiclesList = {
	['police'] = { -- Society in lowercase
		{
			vehicleModel = 'police',
			plate = 'POLICE',
			minimumGrade = 1,
			livery = 4,
			armor = 4,
			brakes = 2,
			engine = 3,
			suspension = 3,
			transmission = 2,
			turbo = true,
			type = "car"
		},
		{
			vehicleModel = 'Police2',
			plate = 'POLICE',
			minimumGrade = 1,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
		{
			vehicleModel = 'riot',
			plate = 'POLICE',
			minimumGrade = 3,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
		{
			vehicleModel = 'sheriff2',
			plate = 'POLICE',
			minimumGrade = 3,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
		{
			vehicleModel = 'pbus',
			plate = 'POLICE',
			minimumGrade = 3,
			livery = -1,
			armor = -1,
			brakes = -1,
			engine = -1,
			suspension = -1,
			transmission = -1,
			turbo = false,
			type = "car"
		},
	},
}

Config.Garages = { -- Garages list/info
	{
		name = "Legion Square", -- Garage name shown in the menu
		coords = vector3(215.66, -809.93, 30.73), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(214.32, -793.27, 30.8),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(233.12, -789.94, 30.6, 160.55),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(222.16, -804.25, 30.58, 250.0), -- Make it work with multiple spawn points
			vector4(223.46, -799.04, 30.58, 250.0),
			vector4(226.3, -791.58, 30.58, 250.0),
			vector4(215.43, -775.99, 30.43, 248.98),
			vector4(232.69, -773.72, 30.32, 249.76)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "legion", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Alta", -- Garage name shown in the menu
		coords = vector3(278.19, -345.95, 44.92), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(294.05, -340.45, 44.92),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(233.12, -789.94, 30.6, 160.55),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(266.84, -328.77, 44.5, 249.42), -- Make it work with multiple spawn points
			vector4(269.29, -322.26, 44.5, 249.45),
			vector4(287.66, -329.12, 44.5, 249.52),
			vector4(283.91, -338.77, 44.5, 249.58),
			vector4(294.68, -346.56, 44.5, 69.93)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "alta", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Textile City", -- Garage name shown in the menu
		coords = vector3(412.74, -634.35, 28.5), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(402.15, -643.13, 28.5),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(423.51, -642.01, 28.08, 179.08),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(408.8, -638.68, 28.08, 270.0), -- Make it work with multiple spawn points
			vector4(393.08, -638.73, 28.08, 270.81),
			vector4(393.21, -649.69, 28.08, 270.43),
			vector4(392.48, -657.72, 28.08, 270.83),
			vector4(415.9, -649.35, 28.08, 270.51)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "textilecity", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Pillbox Hill", -- Garage name shown in the menu
		coords = vector3(-332.01, -781.39, 33.96), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-331.93, -768.52, 33.97),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-348.88, -775.52, 33.54, 359.15),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-320.15, -752.3, 33.54, 159.86), -- Make it work with multiple spawn points
			vector4(-331.77, -750.56, 33.54, 181.7),
			vector4(-341.29, -756.81, 33.54, 91.4),
			vector4(-357.49, -764.41, 33.54, 269.31),
			vector4(-307.79, -756.62, 33.54, 161.04)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "pillboxhill", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "West Vinewood", -- Garage name shown in the menu
		coords = vector3(-515.93, 53.0, 52.58), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-529.11, 48.59, 52.58),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-524.62, 37.15, 52.16, 355.19),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-537.01, 40.77, 52.16, 265.99), -- Make it work with multiple spawn points
			vector4(-509.52, 65.48, 52.16, 85.36),
			vector4(-510.96, 55.17, 52.16, 84.34),
			vector4(-519.69, 66.28, 52.16, 84.99),
			vector4(-504.47, 54.48, 56.07, 265.69)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "westvinewood", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "West Vinewood 2", -- Garage name shown in the menu
		coords = vector3(-570.24, 311.83, 84.49), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-561.5, 328.39, 84.41),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-579.38, 330.2, 84.34, 264.51),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-580.68, 314.45, 84.37, 354.67), -- Make it work with multiple spawn points
			vector4(-588.58, 335.45, 84.67, 175.84),
			vector4(-601.55, 345.46, 84.69, 175.98)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "westvinewood2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Vinewood Hills", -- Garage name shown in the menu
		coords = vector3(886.2, -1.13, 78.76), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(878.34, -10.78, 78.76),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(870.99, -22.5, 78.34, 147.82),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(858.37, -28.97, 78.34, 237.92), -- Make it work with multiple spawn points
			vector4(865.02, -45.35, 78.34, 57.82),
			vector4(890.62, -45.15, 78.34, 57.29)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "vinewoodhills", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Vinewood Hills 2", -- Garage name shown in the menu
		coords = vector3(664.45, 630.94, 128.91), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(655.81, 631.84, 128.91),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(650.71, 617.75, 128.49, 159.21),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(638.47, 606.27, 128.49, 250.49), -- Make it work with multiple spawn points
			vector4(654.98, 606.79, 128.49, 71.33),
			vector4(636.39, 625.62, 128.49, 70.06)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "vinewoodhills2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Vinewood Hills 3", -- Garage name shown in the menu
		coords = vector3(-77.07, 907.36, 235.81), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-75.47, 895.6, 235.5),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-76.79, 894.18, 235.19, 29.7),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-66.23, 892.11, 235.13, 115.63), -- Make it work with multiple spawn points
			vector4(-71.02, 903.26, 235.19, 114.49)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "vinewoodhills3", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Harmony", -- Garage name shown in the menu
		coords = vector3(599.73, 2726.74, 41.91), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(593.19, 2730.84, 42.02),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(612.4, 2731.64, 41.55, 274.05),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(624.26, 2724.0, 41.4, 5.26), -- Make it work with multiple spawn points
			vector4(583.25, 2736.76, 41.58, 184.15),
			vector4(581.21, 2720.36, 41.64, 4.71)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "harmony", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Banham Canyon", -- Garage name shown in the menu
		coords = vector3(-3048.89, 611.0, 7.18), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-3041.26, 607.11, 7.5),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-3040.33, 601.09, 7.15, 290.33),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-3056.03, 608.34, 6.79, 291.97), -- Make it work with multiple spawn points
			vector4(-3053.88, 602.67, 6.87, 289.86),
			vector4(-3051.78, 596.95, 7.02, 289.15)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "banhamcanyon", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Downtown Vinewood", -- Garage name shown in the menu
		coords = vector3(364.39, 297.84, 103.49), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(372.99, 289.74, 103.27),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(362.74, 280.75, 102.89, 189.33),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(386.95, 291.72, 102.63, 165.04), -- Make it work with multiple spawn points
			vector4(392.69, 280.48, 102.56, 71.03),
			vector4(371.48, 266.74, 102.6, 340.53)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "downtownvinewood", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Grand Senora", -- Garage name shown in the menu
		coords = vector3(1984.54, 3065.77, 47.01), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1990.1, 3070.05, 47.0),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(2006.03, 3071.98, 46.63, 59.49),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(2012.04, 3055.3, 46.62, 58.94), -- Make it work with multiple spawn points
			vector4(2016.86, 3062.81, 46.62, 60.09),
			vector4(1999.63, 3081.81, 46.65, 148.07)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "grandsenora", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Sandy Shores MC", -- Garage name shown in the menu
		coords = vector3(1836.58, 3668.21, 33.68), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1844.66, 3663.68, 34.15),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1836.34, 3656.15, 33.85, 118.6),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1853.67, 3676.2, 33.33, 210.23), -- Make it work with multiple spawn points
			vector4(1831.35, 3663.51, 33.44, 210.09),
			vector4(1825.11, 3659.53, 33.58, 209.13)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "sandyshoresmc", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "San Chianski", -- Garage name shown in the menu
		coords = vector3(2761.43, 3452.49, 55.84), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(2750.55, 3445.04, 56.1),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(2777.97, 3462.32, 55.06, 158.35),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(2775.86, 3436.56, 55.39, 67.43), -- Make it work with multiple spawn points
			vector4(2791.24, 3474.5, 54.85, 68.56),
			vector4(2769.44, 3473.51, 55.08, 67.23)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "sanchianski", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Mirror Park", -- Garage name shown in the menu
		coords = vector3(1034.69, -766.03, 58.0), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1025.51, -759.96, 57.99),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1022.15, -771.78, 57.6, 225.44),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1017.16, -760.3, 57.55, 222.93), -- Make it work with multiple spawn points
			vector4(1027.52, -785.35, 57.45, 310.28),
			vector4(1047.0, -785.62, 57.57, 91.26)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "mirrorpark", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "La Puerta", -- Garage name shown in the menu
		coords = vector3(-1082.51, -1261.67, 5.61), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1065.57, -1261.42, 6.01),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-1078.22, -1246.83, 4.84, 215.33),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1075.61, -1267.34, 5.48, 299.93), -- Make it work with multiple spawn points
			vector4(-1080.98, -1258.0, 5.13, 300.38),
			vector4(-1074.83, -1240.87, 4.85, 120.24)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "lapuerta", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Paleto Bay", -- Garage name shown in the menu
		coords = vector3(137.66, 6612.97, 31.83), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(147.58, 6622.93, 31.77),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(129.92, 6607.48, 31.42, 219.53),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(151.05, 6607.28, 31.45, 358.41), -- Make it work with multiple spawn points
			vector4(145.84, 6613.57, 31.39, 359.11),
			vector4(155.75, 6592.76, 31.42, 179.37)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "paletobay", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Paleto Bay 2", -- Garage name shown in the menu
		coords = vector3(-274.94, 6126.03, 31.48), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-280.27, 6120.74, 31.51),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-292.71, 6132.29, 31.08, 206.07),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-282.03, 6142.62, 31.08, 135.25), -- Make it work with multiple spawn points
			vector4(-276.61, 6137.28, 31.08, 135.7),
			vector4(-303.97, 6129.09, 31.08, 225.36)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "paletobay2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Rancho", -- Garage name shown in the menu
		coords = vector3(384.21, -1612.76, 29.29), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(397.2, -1613.16, 29.29),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(385.8, -1622.36, 28.87, 308.69),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(395.51, -1626.53, 28.87, 49.3), -- Make it work with multiple spawn points
			vector4(388.55, -1612.64, 28.87, 230.57)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "rancho", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Rancho 2", -- Garage name shown in the menu
		coords = vector3(443.0, -1969.08, 24.4), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(457.17, -1977.47, 22.96),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(464.89, -1990.1, 22.55, 130.05),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(453.99, -1965.92, 22.55, 180.38), -- Make it work with multiple spawn points
			vector4(449.5, -1960.62, 22.55, 182.45)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "rancho2", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Del Perro", -- Garage name shown in the menu
		coords = vector3(-1523.96, -451.46, 35.6), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1519.72, -445.65, 35.44),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-1524.46, -434.02, 35.02, 207.58),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1522.3, -418.57, 35.02, 230.52), -- Make it work with multiple spawn points
			vector4(-1526.95, -423.81, 35.02, 230.73)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "delperro", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Davis", -- Garage name shown in the menu
		coords = vector3(-71.77, -1821.7, 26.94), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-50.89, -1831.68, 26.57),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-65.56, -1833.55, 26.45, 253.19),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-60.26, -1843.13, 26.16, 319.89), -- Make it work with multiple spawn points
			vector4(-52.36, -1849.82, 25.85, 320.93)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "davis", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Grapeseed", -- Garage name shown in the menu
		coords = vector3(1698.05, 4792.72, 41.92), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1691.35, 4794.65, 41.92),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1708.66, 4802.96, 41.36, 90.87),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1691.42, 4788.03, 41.5, 89.22), -- Make it work with multiple spawn points
			vector4(1691.61, 4774.13, 41.5, 91.71)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "grapeseed", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Mount Chiliad", -- Garage name shown in the menu
		coords = vector3(1721.4, 6410.46, 34.01), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(1722.91, 6394.3, 34.24),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(1734.67, 6398.26, 34.49, 92.25),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(1729.74, 6405.79, 34.04, 152.75), -- Make it work with multiple spawn points
			vector4(1717.45, 6416.34, 33.02, 243.98)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "mountchiliad", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Zancudo River", -- Garage name shown in the menu
		coords = vector3(-1130.62, 2675.25, 18.18), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1136.76, 2669.33, 18.1),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-1153.04, 2661.34, 17.67, 221.45),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1159.62, 2673.95, 17.67, 222.74), -- Make it work with multiple spawn points
			vector4(-1154.93, 2678.09, 17.67, 220.94)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "zancudoriver", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "Tataviam Mountains", -- Garage name shown in the menu
		coords = vector3(2588.15, 426.63, 108.55), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(2570.9, 416.1, 108.46),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(2578.66, 403.31, 108.03, 238.04),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(2576.07, 428.77, 108.03, 180.28), -- Make it work with multiple spawn points
			vector4(2583.07, 428.63, 108.03, 179.74)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "tataviammountains", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	{
		name = "LS Airport", -- Garage name shown in the menu
		coords = vector3(-949.49, -2582.63, 13.83), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-948.02, -2589.07, 13.83),
		storeVehicleMarker = {id = 36, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-959.68, -2594.74, 13.42, 129.07),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-957.98, -2604.35, 13.42, 60.79), -- Make it work with multiple spawn points
			vector4(-957.04, -2583.48, 13.41, 240.27)
		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "lsairport", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
	-- Boats
	{
		name = "Boat", -- Garage name shown in the menu
		coords = vector3(-726.15, -1333.12, 1.6), -- Marker position
		blip = { blipId = 410, blipColor = 3, blipScale = 0.9, blipText = "Boat Garage" }, -- Blip informations
		marker = { id = 35, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 2, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-747.33, -1356.48, 1.1),
		storeVehicleMarker = {id = 35, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 1.0, y = 1.0, z = 1.0 }, radius = 4.0, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-722.91, -1352.47, 0.12, 128.26),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-704.71, -1341.66, -0.09, 134.81), -- Make it work with multiple spawn points
			vector4(-711.88, -1329.8, 0.43, 142.34),

		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "boat", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "boat" -- car, air or boat
	},
	-- Airplanes
	{
		name = "Air", -- Garage name shown in the menu
		coords = vector3(-943.03, -2962.05, 13.95), -- Marker position
		blip = { blipId = 43, blipColor = 3, blipScale = 0.9, blipText = "Air Garage" }, -- Blip informations
		marker = { id = 34, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 5, -- Interaction radius for the marker
		storeVehicleCoords = vector3(-1007.54, -2979.84, 13.95),
		storeVehicleMarker = {id = 34, color = { r = 255, g = 0, b = 0, a = 90 }, size = { x = 1.25, y = 1.25, z = 1.25 }, radius = 5.0, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(-979.32, -2997.89, 13.95, 59.19),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(-1007.13, -3015.86, 13.95, 55.89), -- Make it work with multiple spawn points
			vector4(-979.32, -2997.89, 13.95, 59.19),
			vector4(-960.99, -2964.56, 13.95, 57.96)

		},
		infiniteVehicles = false, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "air", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "", -- Leave blank if not in use
		type = "air" -- car, air or boat
	},
	{
		name = "LSPD", -- Garage name shown in the menu
		coords = vector3(456.05, -1020.52, 28.28), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Police Garage" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		storeVehicleCoords = vector3(452.69, -1013.04, 28.47),
		storeVehicleMarker = {id = 36, color = {r = 255, g = 0, b = 0, a = 90}, size = {x = 1.25, y = 1.25, z = 1.25}, radius = 2.5, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations for the sell vehicle marker
		viewVehicleCoords = vector4(233.12, -789.94, 30.6, 160.55),
		vehicleSpawn = { -- Where the vehicle spawns when you take it out
			vector4(446.43, -1025.51, 28.64, 360.0), -- Make it work with multiple spawn points
			vector4(442.97, -1026.19, 28.71, 360.0),
			vector4(438.99, -1026.51, 28.78, 360.0),
			vector4(435.43, -1027.24, 28.84, 360.0),
			vector4(431.69, -1027.66, 28.91, 360.0),
			vector4(427.49, -1028.11, 28.99, 360.0)
		},
		infiniteVehicles = true, -- This will work for societies only, set the society vehicles in the Config.SocietyVehiclesList
		id = "police1", -- ID of the garage, it's used to get what garage is opened | needs to be DIFFERENT for each garage
		society = "police", -- Leave blank if not in use
		type = "car" -- car, air or boat
	},
}

Config.Impound = { -- Garages list/info
	{
		name = "LS Impound", -- Garage name shown in the menu
		coords = vector3(409.57, -1623.24, 29.29), -- Marker position
		blip = { blipId = 524, blipColor = 5, blipScale = 0.9, blipText = "Impound" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		type = "car", -- type of vehicle to appear in the impound menu ("" = all)
		vehicleSpawn = { -- Where the vehicle spawns when you recover it
			vector4(396.0, -1644.6, 29.29, 140.0), -- Make it work with multiple spawn points
			vector4(398.4, -1646.6, 29.29, 140.0),
			vector4(400.8, -1648.6, 29.29, 140.0),
			vector4(403.2, -1650.6, 29.29, 140.0),
			vector4(405.6, -1652.6, 29.29, 140.0),
			vector4(408.0, -1654.6, 29.29, 140.0),
			vector4(410.4, -1656.6, 29.29, 140.0),
			vector4(417.1, -1627.8, 29.29, 320.0)
		},
	},
	{
		name = "PB Impound", -- Garage name shown in the menu
		coords = vector3(-270.15, 6130.77, 31.51), -- Marker position
		blip = { blipId = 524, blipColor = 5, blipScale = 0.9, blipText = "Impound" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		type = "", -- type of vehicle to appear in the impound menu ("" = all)
		vehicleSpawn = { -- Where the vehicle spawns when you recover it
			vector4(-282.03, 6142.62, 31.08, 135.25), -- Make it work with multiple spawn points
			vector4(-276.61, 6137.28, 31.08, 135.7),
			vector4(-303.97, 6129.09, 31.08, 225.36)
		},
	},
}

Config.UseRecoverStolenVehicles = true

Config.RecoverVehiclePrice = 500

Config.RecoverVehicle = {
	{
		name = "LSPD Recover", -- Garage name shown in the menu
		coords = vector3(437.76, -979.36, 30.69), -- Marker position
		blip = { blipId = 524, blipColor = 3, blipScale = 0.9, blipText = "Recover Vehicle" }, -- Blip informations
		marker = { id = 36, color = { r = 31, g = 94, b = 255, a = 90 }, size = { x = 0.7, y = 0.7, z = 0.7 }, bobUpAndDown = 0, faceCamera = 0, rotate = 1, drawOnEnts = 0, textureDict = 0, textureName = 0 }, -- Marker informations
		radius = 1, -- Interaction radius for the marker
		vehicleSpawn = { -- Where the vehicle spawns when you recover it
			vector4(407.77, -979.66, 29.27, 231.52), -- Make it work with multiple spawn points
			vector4(407.3, -984.0, 29.27, 231.52),
			vector4(407.78, -988.8, 29.27, 231.52),
			vector4(407.82, -993.31, 29.27, 231.52),
			vector4(407.78, -997.91, 29.27, 231.52),
			vector4(402.9, -996.1, 29.36, 360.0),
			vector4(403.0, -987.17, 29.36, 360.0),
			vector4(403.0, -978.17, 29.36, 360.0)
		},
	},
}


-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to sv_utils.lua, line 3

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.StoreVehicleWebhookColor = '65352'

Config.TakeOutVehicleWebhookColor = '16711680'

Config.ShareWebhookColor = '16127'

Config.TransferWebhookColor = '16776960'

Config.CompanyWebhookColor = '7100555'

-------------------------- LOCALES (DON'T TOUCH)

function _L(id) 
	if Locales[Config.Locale][id] then 
		return Locales[Config.Locale][id] 
	else 
		print("Locale '"..id.."' doesn't exist") 
	end 
end

-- V1.3.5
```

{% endtab %}
{% endtabs %}


# RGB vehicle colors

### ESX

Navigate to **es\_extended/client/functions.lua** and entirely replace the following functions:

{% tabs %}
{% tab title="ESX.Game.GetVehicleProperties" %}

```lua
function ESX.Game.GetVehicleProperties(vehicle)
    if DoesEntityExist(vehicle) then
        local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)

        local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
        if GetIsVehiclePrimaryColourCustom(vehicle) then
            local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
            colorPrimary = {r, g, b}
        end

        if GetIsVehicleSecondaryColourCustom(vehicle) then
            local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
            colorSecondary = {r, g, b}
        end

        local extras = {}
        for extraId = 0, 12 do
            if DoesExtraExist(vehicle, extraId) then
                local state = IsVehicleExtraTurnedOn(vehicle, extraId) == 1
                extras[tostring(extraId)] = state
            end
        end

        local modLivery = GetVehicleMod(vehicle, 48)
        if GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) ~= 0 then
            modLivery = GetVehicleLivery(vehicle)
        end

        local tireHealth = {}
        for i = 0, 3 do
            tireHealth[i] = GetVehicleWheelHealth(vehicle, i)
        end

        local tireBurstState = {}
        for i = 0, 5 do
            tireBurstState[i] = IsVehicleTyreBurst(vehicle, i, false)
        end

        local tireBurstCompletely = {}
        for i = 0, 5 do
            tireBurstCompletely[i] = IsVehicleTyreBurst(vehicle, i, true)
        end

        local windowStatus = {}
        for i = 0, 7 do
            windowStatus[i] = IsVehicleWindowIntact(vehicle, i) == 1
        end

        local doorStatus = {}
        for i = 0, 5 do
            doorStatus[i] = IsVehicleDoorDamaged(vehicle, i) == 1
        end

        local xenonsCustomColor = {}
        local xenonsCustomColorEnabled, x_red, x_green, x_blue = GetVehicleXenonLightsCustomColor(vehicle)
        if xenonsCustomColorEnabled then
            xenonsCustomColor = {x_red, x_green, x_blue}
        end

        local paintType_1, color1, pearlescentColor_1 = GetVehicleModColor_1(vehicle)
        local paintType_2, color2 = GetVehicleModColor_2(vehicle)

        local modBulletProofTires
        if GetVehicleTyresCanBurst(vehicle) then
            modBulletProofTires = false
        else
            modBulletProofTires = true
        end

        return {
            model = GetEntityModel(vehicle),
            plate = ESX.Math.Trim(GetVehicleNumberPlateText(vehicle)),
            plateIndex = GetVehicleNumberPlateTextIndex(vehicle),
            bodyHealth = ESX.Math.Round(GetVehicleBodyHealth(vehicle), 0.1),
            engineHealth = ESX.Math.Round(GetVehicleEngineHealth(vehicle), 0.1),
            tankHealth = ESX.Math.Round(GetVehiclePetrolTankHealth(vehicle), 0.1),
            fuelLevel = ESX.Math.Round(GetVehicleFuelLevel(vehicle), 0.1),
            dirtLevel = ESX.Math.Round(GetVehicleDirtLevel(vehicle), 0.1),
            oilLevel = ESX.Math.Round(GetVehicleOilLevel(vehicle), 0.1),
            color1 = colorPrimary,
            color2 = colorSecondary,
            pearlescentColor = pearlescentColor,
            dashboardColor = GetVehicleDashboardColour(vehicle),
            wheelColor = wheelColor,
            wheels = GetVehicleWheelType(vehicle),
            wheelSize = GetVehicleWheelSize(vehicle),
            wheelWidth = GetVehicleWheelWidth(vehicle),
            tireHealth = tireHealth,
            tireBurstState = tireBurstState,
            tireBurstCompletely = tireBurstCompletely,
            windowTint = GetVehicleWindowTint(vehicle),
            windowStatus = windowStatus,
            doorStatus = doorStatus,
            xenonColor = GetVehicleXenonLightsColour(vehicle),
            neonEnabled = {IsVehicleNeonLightEnabled(vehicle, 0), IsVehicleNeonLightEnabled(vehicle, 1),
                           IsVehicleNeonLightEnabled(vehicle, 2), IsVehicleNeonLightEnabled(vehicle, 3)},
            neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)),
            headlightColor = GetVehicleHeadlightsColour(vehicle),
            interiorColor = GetVehicleInteriorColour(vehicle),
            extras = extras,
            tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)),
            modSpoilers = GetVehicleMod(vehicle, 0),
            modFrontBumper = GetVehicleMod(vehicle, 1),
            modRearBumper = GetVehicleMod(vehicle, 2),
            modSideSkirt = GetVehicleMod(vehicle, 3),
            modExhaust = GetVehicleMod(vehicle, 4),
            modFrame = GetVehicleMod(vehicle, 5),
            modGrille = GetVehicleMod(vehicle, 6),
            modHood = GetVehicleMod(vehicle, 7),
            modFender = GetVehicleMod(vehicle, 8),
            modRightFender = GetVehicleMod(vehicle, 9),
            modRoof = GetVehicleMod(vehicle, 10),
            modEngine = GetVehicleMod(vehicle, 11),
            modBrakes = GetVehicleMod(vehicle, 12),
            modTransmission = GetVehicleMod(vehicle, 13),
            modHorns = GetVehicleMod(vehicle, 14),
            modSuspension = GetVehicleMod(vehicle, 15),
            modArmor = GetVehicleMod(vehicle, 16),
            modKit17 = GetVehicleMod(vehicle, 17),
            modTurbo = IsToggleModOn(vehicle, 18),
            modKit19 = GetVehicleMod(vehicle, 19),
            modSmokeEnabled = IsToggleModOn(vehicle, 20),
            modKit21 = GetVehicleMod(vehicle, 21),
            modXenon = IsToggleModOn(vehicle, 22),
            modFrontWheels = GetVehicleMod(vehicle, 23),
            modBackWheels = GetVehicleMod(vehicle, 24),
            modCustomTiresF = GetVehicleModVariation(vehicle, 23),
            modCustomTiresR = GetVehicleModVariation(vehicle, 24),
            modPlateHolder = GetVehicleMod(vehicle, 25),
            modVanityPlate = GetVehicleMod(vehicle, 26),
            modTrimA = GetVehicleMod(vehicle, 27),
            modOrnaments = GetVehicleMod(vehicle, 28),
            modDashboard = GetVehicleMod(vehicle, 29),
            modDial = GetVehicleMod(vehicle, 30),
            modDoorSpeaker = GetVehicleMod(vehicle, 31),
            modSeats = GetVehicleMod(vehicle, 32),
            modSteeringWheel = GetVehicleMod(vehicle, 33),
            modShifterLeavers = GetVehicleMod(vehicle, 34),
            modAPlate = GetVehicleMod(vehicle, 35),
            modSpeakers = GetVehicleMod(vehicle, 36),
            modTrunk = GetVehicleMod(vehicle, 37),
            modHydrolic = GetVehicleMod(vehicle, 38),
            modEngineBlock = GetVehicleMod(vehicle, 39),
            modAirFilter = GetVehicleMod(vehicle, 40),
            modStruts = GetVehicleMod(vehicle, 41),
            modArchCover = GetVehicleMod(vehicle, 42),
            modAerials = GetVehicleMod(vehicle, 43),
            modTrimB = GetVehicleMod(vehicle, 44),
            modTank = GetVehicleMod(vehicle, 45),
            modWindows = GetVehicleMod(vehicle, 46),
            modKit47 = GetVehicleMod(vehicle, 47),
            modLivery = modLivery,
            modKit49 = GetVehicleMod(vehicle, 49),
            liveryRoof = GetVehicleRoofLivery(vehicle),
            modBulletProofTires = modBulletProofTires,
            paintType1 = paintType_1,
            paintType2 = paintType_2,
            xenonCustomColorEnabled = xenonsCustomColorEnabled,
            xenonCustomColor = xenonsCustomColor
        }
    else
        return
    end
end
```

{% endtab %}

{% tab title="ESX.Game.SetVehicleProperties" %}

```lua
function ESX.Game.SetVehicleProperties(vehicle, props)
    if DoesEntityExist(vehicle) then
        if props.extras then
            for id, enabled in pairs(props.extras) do
                if enabled then
                    SetVehicleExtra(vehicle, tonumber(id), 0)
                else
                    SetVehicleExtra(vehicle, tonumber(id), 1)
                end
            end
        end

        local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
        local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)

        SetVehicleModKit(vehicle, 0)
        if props.plate then
            SetVehicleNumberPlateText(vehicle, props.plate)
        end
        if props.plateIndex then
            SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex)
        end
        if props.bodyHealth then
            SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0)
        end
        if props.engineHealth then
            SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0)
        end
        if props.tankHealth then
            SetVehiclePetrolTankHealth(vehicle, props.tankHealth)
        end
        if props.fuelLevel then
            SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0)
        end
        if props.dirtLevel then
            SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0)
        end
        if props.oilLevel then
            SetVehicleOilLevel(vehicle, props.oilLevel)
        end
        if props.color1 ~= nil then
            if type(props.color1) == 'number' then
                ClearVehicleCustomPrimaryColour(vehicle)
                SetVehicleModColor_1(vehicle, props.paintType1, props.color1, props.pearlescentColor)
                SetVehicleColours(vehicle, props.color1, props.color2)
            else
                SetVehicleModColor_1(vehicle, props.paintType1, 0, props.pearlescentColor)
                SetVehicleCustomPrimaryColour(vehicle, props.color1[1], props.color1[2], props.color1[3])
            end
        end

        if props.color2 ~= nil then
            if type(props.color2) == 'number' then
                ClearVehicleCustomSecondaryColour(vehicle)
                SetVehicleModColor_2(vehicle, props.paintType2, props.color2)
                SetVehicleColours(vehicle, props.color1, props.color2)
                if type(props.color1) ~= 'number' then
                    SetVehicleModColor_1(vehicle, props.paintType1, 0, props.pearlescentColor)
                end
            else
                SetVehicleModColor_2(vehicle, props.paintType2, 0)
                SetVehicleCustomSecondaryColour(vehicle, props.color2[1], props.color2[2], props.color2[3])
            end
        end
        if props.pearlescentColor then
            SetVehicleExtraColours(vehicle, props.pearlescentColor, wheelColor)
        end
        if props.interiorColor then
            SetVehicleInteriorColor(vehicle, props.interiorColor)
        end
        if props.dashboardColor then
            SetVehicleDashboardColour(vehicle, props.dashboardColor)
        end
        if props.wheelColor then
            SetVehicleExtraColours(vehicle, props.pearlescentColor or pearlescentColor, props.wheelColor)
        end
        if props.wheels then
            SetVehicleWheelType(vehicle, props.wheels)
        end
        if props.tireHealth then
            for wheelIndex, health in pairs(props.tireHealth) do
                SetVehicleWheelHealth(vehicle, wheelIndex, health)
            end
        end
        if props.tireBurstState then
            for wheelIndex, burstState in pairs(props.tireBurstState) do
                if burstState then
                    SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), false, 1000.0)
                end
            end
        end
        if props.tireBurstCompletely then
            for wheelIndex, burstState in pairs(props.tireBurstCompletely) do
                if burstState then
                    SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), true, 1000.0)
                end
            end
        end
        if type(props.modBulletProofTires) == 'boolean' then
            if props.modBulletProofTires then
                SetVehicleTyresCanBurst(vehicle, false)
            else
                SetVehicleTyresCanBurst(vehicle, true)
            end
        end
        if props.windowTint then
            SetVehicleWindowTint(vehicle, props.windowTint)
        end
        if props.windowStatus then
            for windowIndex, smashWindow in pairs(props.windowStatus) do
                if not smashWindow then
                    SmashVehicleWindow(vehicle, windowIndex)
                end
            end
        end
        if props.doorStatus then
            for doorIndex, breakDoor in pairs(props.doorStatus) do
                if breakDoor then
                    SetVehicleDoorBroken(vehicle, tonumber(doorIndex), true)
                end
            end
        end
        if props.neonEnabled then
            SetVehicleNeonLightEnabled(vehicle, 0, props.neonEnabled[1])
            SetVehicleNeonLightEnabled(vehicle, 1, props.neonEnabled[2])
            SetVehicleNeonLightEnabled(vehicle, 2, props.neonEnabled[3])
            SetVehicleNeonLightEnabled(vehicle, 3, props.neonEnabled[4])
        end
        if props.neonColor then
            SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3])
        end
        if props.headlightColor then
            SetVehicleHeadlightsColour(vehicle, props.headlightColor)
        end
        if props.interiorColor then
            SetVehicleInteriorColour(vehicle, props.interiorColor)
        end
        if props.wheelSize then
            SetVehicleWheelSize(vehicle, props.wheelSize)
        end
        if props.wheelWidth then
            SetVehicleWheelWidth(vehicle, props.wheelWidth)
        end
        if props.tyreSmokeColor then
            SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3])
        end
        if props.modSpoilers then
            SetVehicleMod(vehicle, 0, props.modSpoilers, false)
        end
        if props.modFrontBumper then
            SetVehicleMod(vehicle, 1, props.modFrontBumper, false)
        end
        if props.modRearBumper then
            SetVehicleMod(vehicle, 2, props.modRearBumper, false)
        end
        if props.modSideSkirt then
            SetVehicleMod(vehicle, 3, props.modSideSkirt, false)
        end
        if props.modExhaust then
            SetVehicleMod(vehicle, 4, props.modExhaust, false)
        end
        if props.modFrame then
            SetVehicleMod(vehicle, 5, props.modFrame, false)
        end
        if props.modGrille then
            SetVehicleMod(vehicle, 6, props.modGrille, false)
        end
        if props.modHood then
            SetVehicleMod(vehicle, 7, props.modHood, false)
        end
        if props.modFender then
            SetVehicleMod(vehicle, 8, props.modFender, false)
        end
        if props.modRightFender then
            SetVehicleMod(vehicle, 9, props.modRightFender, false)
        end
        if props.modRoof then
            SetVehicleMod(vehicle, 10, props.modRoof, false)
        end
        if props.modEngine then
            SetVehicleMod(vehicle, 11, props.modEngine, false)
        end
        if props.modBrakes then
            SetVehicleMod(vehicle, 12, props.modBrakes, false)
        end
        if props.modTransmission then
            SetVehicleMod(vehicle, 13, props.modTransmission, false)
        end
        if props.modHorns then
            SetVehicleMod(vehicle, 14, props.modHorns, false)
        end
        if props.modSuspension then
            SetVehicleMod(vehicle, 15, props.modSuspension, false)
        end
        if props.modArmor then
            SetVehicleMod(vehicle, 16, props.modArmor, false)
        end
        if props.modKit17 then
            SetVehicleMod(vehicle, 17, props.modKit17, false)
        end
        if type(props.modTurbo) ~= "nil" then
            ToggleVehicleMod(vehicle, 18, props.modTurbo)
        end
        if props.modKit19 then
            SetVehicleMod(vehicle, 19, props.modKit19, false)
        end
        if type(props.modSmokeEnabled) ~= 'nil' then
            ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled and true or false)
        end
        if props.modKit21 then
            SetVehicleMod(vehicle, 21, props.modKit21, false)
        end
        if type(props.modXenon) ~= 'nil' then
            ToggleVehicleMod(vehicle, 22, props.modXenon)
        end
        if props.xenonCustomColorEnabled and props.xenonCustomColor then
            SetVehicleXenonLightsCustomColor(vehicle, props.xenonCustomColor[1], props.xenonCustomColor[2],
                props.xenonCustomColor[3])
        elseif props.xenonColor then
            SetVehicleXenonLightsColor(vehicle, props.xenonColor)
        end
        if props.modFrontWheels then
            SetVehicleMod(vehicle, 23, props.modFrontWheels, false)
        end
        if props.modBackWheels then
            SetVehicleMod(vehicle, 24, props.modBackWheels, false)
        end
        if props.modCustomTiresF then
            SetVehicleMod(vehicle, 23, props.modFrontWheels, props.modCustomTiresF)
        end
        if props.modCustomTiresR then
            SetVehicleMod(vehicle, 24, props.modBackWheels, props.modCustomTiresR)
        end
        if props.modPlateHolder then
            SetVehicleMod(vehicle, 25, props.modPlateHolder, false)
        end
        if props.modVanityPlate then
            SetVehicleMod(vehicle, 26, props.modVanityPlate, false)
        end
        if props.modTrimA then
            SetVehicleMod(vehicle, 27, props.modTrimA, false)
        end
        if props.modOrnaments then
            SetVehicleMod(vehicle, 28, props.modOrnaments, false)
        end
        if props.modDashboard then
            SetVehicleMod(vehicle, 29, props.modDashboard, false)
        end
        if props.modDial then
            SetVehicleMod(vehicle, 30, props.modDial, false)
        end
        if props.modDoorSpeaker then
            SetVehicleMod(vehicle, 31, props.modDoorSpeaker, false)
        end
        if props.modSeats then
            SetVehicleMod(vehicle, 32, props.modSeats, false)
        end
        if props.modSteeringWheel then
            SetVehicleMod(vehicle, 33, props.modSteeringWheel, false)
        end
        if props.modShifterLeavers then
            SetVehicleMod(vehicle, 34, props.modShifterLeavers, false)
        end
        if props.modAPlate then
            SetVehicleMod(vehicle, 35, props.modAPlate, false)
        end
        if props.modSpeakers then
            SetVehicleMod(vehicle, 36, props.modSpeakers, false)
        end
        if props.modTrunk then
            SetVehicleMod(vehicle, 37, props.modTrunk, false)
        end
        if props.modHydrolic then
            SetVehicleMod(vehicle, 38, props.modHydrolic, false)
        end
        if props.modEngineBlock then
            SetVehicleMod(vehicle, 39, props.modEngineBlock, false)
        end
        if props.modAirFilter then
            SetVehicleMod(vehicle, 40, props.modAirFilter, false)
        end
        if props.modStruts then
            SetVehicleMod(vehicle, 41, props.modStruts, false)
        end
        if props.modArchCover then
            SetVehicleMod(vehicle, 42, props.modArchCover, false)
        end
        if props.modAerials then
            SetVehicleMod(vehicle, 43, props.modAerials, false)
        end
        if props.modTrimB then
            SetVehicleMod(vehicle, 44, props.modTrimB, false)
        end
        if props.modTank then
            SetVehicleMod(vehicle, 45, props.modTank, false)
        end
        if props.modWindows then
            SetVehicleMod(vehicle, 46, props.modWindows, false)
        end
        if props.modKit47 then
            SetVehicleMod(vehicle, 47, props.modKit47, false)
        end
        if props.modLivery then
            SetVehicleMod(vehicle, 48, props.modLivery, false)
            SetVehicleLivery(vehicle, props.modLivery)
        end
        if props.modKit49 then
            SetVehicleMod(vehicle, 49, props.modKit49, false)
        end
        if props.liveryRoof then
            SetVehicleRoofLivery(vehicle, props.liveryRoof)
        end
    end
end
```

{% endtab %}
{% endtabs %}


# Inventories metadata

Keys metadata for the different inventories

## qb-inventory

Navigate to **qb-core/shared/items.lua** and add the following code:

```lua
['keys']                           = {['name'] = 'keys',                              ['label'] = 'Car Keys',                 ['weight'] = 500,         ['type'] = 'item',         ['image'] = 'keys.png',                 ['unique'] = true,     ['useable'] = true,     ['shouldClose'] = true,       ['combinable'] = nil,   ['description'] = 'Car Keys'},
```

Go to **qb-inventory/apps.js** and add:

<pre class="language-lua"><code class="lang-lua">} else if (itemData.name == "keys") {
<strong>    $(".item-info-description").html(
</strong>     "&#x3C;p>&#x3C;strong>License Plate: &#x3C;/strong>&#x3C;span>" +
     itemData.info.plate +
    "&#x3C;/span>&#x3C;/p>&#x3C;br />&#x3C;p>" +
     itemData.description +
    "&#x3C;/p>"
);
</code></pre>

Under:

```lua
} else {
    $(".item-info-description").html(
     "<p><strong>Serial Number: </strong><span>" +
    itemData.info.serie +
     "</span></p><p><strong>Munition: </strong><span>" +
    itemData.info.ammo +
     "</span></p><p>" +
    itemData.description +
       "</p>"
    );
}
```

## ox\_inventory

Navigate to **ox\_inventory/data/items.lua** and add the following code:

```lua
['keys'] = {
    label = 'Car Keys',
    weight = 1,
    stack = false,
    close = false,
    description = "Car Keys",
    server = {
        export = 'okokGarage.lockvehicle',
    },
},
```


# Housing integrations

## Loaf Housing

Navigate to **loaf\_housing/client/main.lua** and add the following code:

```lua
elseif not shouldAddMarker and GetResourceState("okokGarage") == "started" then
     if not house.garageMarker then
          house.garageMarker = lib.AddMarker({
             coords = house.garage.exit.xyz - vector3(0.0, 0.0, 1.0),
             scale = vector3(3.0, 3.0, 1.0),
             callbackData = {},
             key = "primary",
             text = "Garage",
          }, nil, nil, function()
          if IsPedInAnyVehicle(PlayerPedId()) then
            TriggerEvent("okokGarage:StoreVehiclePrivate")
          else
            TriggerEvent("okokGarage:OpenPrivateGarageMenu", GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))
          end
      end)
   end
end
```

### esx\_property

Navigate to **esx\_property/client/main.lua** and add the following code:

```lua
function StoreVehicle(PropertyId)
  TriggerEvent("okokGarage:StoreVehiclePrivate")
end

function AccessGarage(PropertyId)
  TriggerEvent("okokGarage:OpenPrivateGarageMenu", GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))
end
```


# qb-phone support

1. Navigate to **qb-phone/fxmanifest.lua** and replace:

```lua
shared_scripts {
    'config.lua',
    '@qb-apartments/config.lua',
    '@qb-garages/config.lua',
}
```

With:

```lua
shared_scripts {
    'config.lua',
    '@qb-apartments/config.lua',
}
```

2. Then, on **qb-phone/server/main.lua,** around the line **230,** replace:

```lua
if garageresult[1] ~= nil then
    for _, v in pairs(garageresult) do
        local vehicleModel = v.vehicle
        if (QBCore.Shared.Vehicles[vehicleModel] ~= nil) and (Config.Garages[v.garage] ~= nil) then
            v.garage = Config.Garages[v.garage].label
            v.vehicle = QBCore.Shared.Vehicles[vehicleModel].name
            v.brand = QBCore.Shared.Vehicles[vehicleModel].brand
        end

    end
    PhoneData.Garage = garageresult
end
```

With:

```lua
if garageresult[1] ~= nil then
    for _, v in pairs(garageresult) do
        local vehicleModel = v.vehicle
        if (QBCore.Shared.Vehicles[vehicleModel] ~= nil) then
            v.garage = v.garage
            v.vehicle = QBCore.Shared.Vehicles[vehicleModel].name
            v.brand = QBCore.Shared.Vehicles[vehicleModel].brand
        end

    end
    PhoneData.Garage = garageresult
end
```

3. Now, go to **qb-phone/client/main.lua** and replace the code around the line **302**:

```lua
QBCore.Functions.TriggerCallback('qb-garage:server:GetPlayerVehicles', function(vehicles)
```

With:

```lua
QBCore.Functions.TriggerCallback('okokGarage:GetPlayerVehicles', function(vehicles)
```

4. Then, on **okokGarage/sv\_utils.lua,** around the line **348**, before the `function tablelength(T)` add:

```lua
QBCore.Functions.CreateCallback('okokGarage:GetPlayerVehicles', function(source, cb)
    local Player = QBCore.Functions.GetPlayer(source)
    local Vehicles = {}

    MySQL.query('SELECT * FROM player_vehicles WHERE citizenid = ?', {Player.PlayerData.citizenid}, function(result)
        if result[1] then
            for _, v in pairs(result) do
                local VehicleData = QBCore.Shared.Vehicles[v.vehicle]
                local VehicleGarage = "No garage"
                local garageConfig = nil
                
                for _, garage in pairs(Config.Garages) do
                    if garage.id == v.garage then
                        garageConfig = garage
                        break
                    end
                end
                
                if garageConfig ~= nil then
                    VehicleGarage = garageConfig.name
                else
                    VehicleGarage = "Unknown"
                end

                if v.state == 0 then
                    v.state = "Outside"
                elseif v.state == 1 then
                    v.state = "Garaged"
                elseif v.state == 2 then
                    v.state = "Impounded"
                end

                local fullname
                if VehicleData["brand"] ~= nil then
                    fullname = VehicleData["brand"] .. " " .. VehicleData["name"]
                else
                    fullname = VehicleData["name"]
                end
                Vehicles[#Vehicles+1] = {
                    fullname = fullname,
                    brand = VehicleData["brand"],
                    model = VehicleData["name"],
                    plate = v.plate,
                    garage = VehicleGarage,
                    state = v.state,
                    fuel = v.fuel,
                    engine = v.engine,
                    body = v.body
                }
            end
            cb(Vehicles)
        else
            cb(nil)
        end
    end)
end)
```


# okokMarketplace

[**YouTube Video**](https://www.youtube.com/watch?v=IGhbMxmgESo)

## Installation Guide

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokmarketplace_vehicles`  (
    `id` int(255) NOT NULL AUTO_INCREMENT,
    `item_id` varchar(255) NOT NULL,
    `plate` varchar(255) NOT NULL,
    `label` varchar(255) NOT NULL,
    `author_identifier` varchar(255) NOT NULL,
    `author_name` varchar(255) NULL DEFAULT NULL,
    `phone_number` varchar(255) NULL DEFAULT NULL,
    `description` varchar(255) NULL DEFAULT NULL,
    `price` varchar(255) NOT NULL,
    `sold` tinyint(1) NOT NULL DEFAULT 0,
    `start_date` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `okokmarketplace_items`  (
    `id` int(255) NOT NULL AUTO_INCREMENT,
    `item_id` varchar(255) NOT NULL,
    `label` varchar(255) NOT NULL,
    `amount` varchar(255) NULL DEFAULT NULL,
    `author_identifier` varchar(255) NOT NULL,
    `author_name` varchar(255) NULL DEFAULT NULL,
    `phone_number` varchar(255) NULL DEFAULT NULL,
    `description` varchar(255) NULL DEFAULT NULL,
    `price` varchar(255) NOT NULL,
    `sold` tinyint(1) NOT NULL DEFAULT 0,
    `start_date` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `okokmarketplace_blackmarket`  (
    `id` int(255) NOT NULL AUTO_INCREMENT,
    `item_id` varchar(255) NOT NULL,
    `label` varchar(255) NOT NULL,
    `type` varchar(255) NOT NULL,
    `amount` varchar(255) NOT NULL,
    `author_identifier` varchar(255) NOT NULL,
    `author_name` varchar(255) NULL DEFAULT NULL,
    `phone_number` varchar(255) NULL DEFAULT NULL,
    `description` varchar(255) NULL DEFAULT NULL,
    `price` varchar(255) NOT NULL,
    `sold` tinyint(1) NOT NULL DEFAULT 0,
    `start_date` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
);
```

### Adding images to the items/vehicles

To add items and vehicle images simply drop them in **okokMarketplace/web/icons**.

* The images should be in the **PNG** format;
* Items: the image name should be the same as the item ID, if the item ID is "**bread**", then the image should be "**bread.png**";
* Vehicles: the image name should be the **\<gameName>** of the vehicle (you can find the \<gameName> in the **vehicles.meta** file of each vehicle), examples:
  * If the vehicle \<gameName> is **DS3**, then the image should be "**DS3.png**";
  * If the vehicle \<gameName> is **La Voiture**, then the image should be "**LaVoiture.png**".


# Config file

```lua
Config = {}

-------------------
-- false = use command to open the market | true = use blips to open the market
Config.UseBlipToAccessMarket = true

-- If false:
-- This will let the player open the market anywhere
Config.MarketCommand = "market" -- Command to open the market

-- If true:
Config.OpenMarketKey = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.ShowFloorBlips = true -- If true it'll show the crafting markers on the floor

Config.UseOkokTextUI = true -- true = okokTextUI (I recommend you using this since it is way more optimized than the default ShowHelpNotification) | false = ShowHelpNotification

Config.ShowBlipsOnMap = true -- Will show the blips on the map (if true it'll use the blipId, blipColor, blipScale and blipText to create them)

Config.BlipCoords = { 
	{x = -1082.2, y = -247.7, z = 37.75, radius = 2, blipId = 78, blipColor = 3, blipScale = 0.9, blipText = "Marketplace", showMarkerRadius = 50, MarkerID = 29},
	{x = -1075.4, y = -247.2, z = 44.02, radius = 2, blipId = 78, blipColor = 3, blipScale = 0.9, blipText = "Marketplace", showMarkerRadius = 50, MarkerID = 29},
	{x = 0.0, y = 0.0, z = 0.0, radius = 2, blipId = 78, blipColor = 3, blipScale = 0.9, blipText = "Marketplace", showMarkerRadius = 50, MarkerID = 29},
}
-- x, y, z, radius: Coordinates of the market blips and interaction radius
-- blipId, blipColor, blipScale, blipText: blips on the map: https://docs.fivem.net/docs/game-references/blips/
-- MarkerID: id of the marker on the ground https://docs.fivem.net/docs/game-references/markers/
-- showMarkerRadius: How close you need to be to see the marker
-------------------

-- Jobs that can access the blackmarket
Config.BlackmarketAllowedJobs = {
	{
		job = "police", -- Job that can access the blackmarket
		grade = { -- Grades that can access the blackmarket
			"boss",
			"rookie",
		}
	},
	{
		job = "ballas",
		grade = { -- If this field is blank all grades can access it
			
		}
	},
}

-- true = use dirty money on blackmarket | false = use bank money on blackmarket
Config.UseDirtyMoneyOnBlackmarket = false

Config.Blackmarket = { -- (item/weapon) / if is weapon then: {"weapon id", true}, if is item then: {"item id", false} (all blackmarket items need to be on the BlacklistItems)
	{"WEAPON_ASSAULTRIFLE", true},
	{"WEAPON_PISTOL", true},
	{"bandage", false},
	{"grip", false},
	{"trigger", false},
}

Config.BlacklistItems = { -- items/weapons that are not allowed to be sold on normal market
	"bandage",
	"grip",
	"trigger",
	"WEAPON_ASSAULTRIFLE",
	"WEAPON_PISTOL",
}

Config.BlacklistVehicles = { -- all vehicles that are not allowed to be sold on the market (check the gameName on vehicles.meta -> <gameName>Supra</gameName>)
	"Supra",
	"M8",
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to server.lua, line 2

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.AddAdColor = '6225733'

Config.BuyItemColor = '224'

Config.RemoveAdColor = '16711680'

Config.ClaimAdColor = '12231480'
```


# Common errors

#### **ESX 1.1 ONLY**

{% hint style="danger" %}
**SCRIPT ERROR: @okokMarketplace/server.lua:611: attempt to call a nil value (field 'canCarryItem')**
{% endhint %}

Go to the **server.lua** file and replace:

```lua
if blackmarket[1].type == "item" and xPlayer.canCarryItem(blackmarket[1].item_id, 1) then
```

With:

```lua
if blackmarket[1].type == "item" then
```

Replace:

```lua
elseif blackmarket[1].type == "item" and not xPlayer.canCarryItem(blackmarket[1].item_id, tonumber(blackmarket[1].amount)) then
```

With:

```lua
elseif blackmarket[1].type == "item" then
```

Replace:

```lua
if xPlayer.canCarryItem(items[1].item_id, tonumber(items[1].amount)) then
```

With:

```lua
if true then
```


# okokChat

[**YouTube Video**](https://www.youtube.com/watch?v=SYvg7MHLDPk)

## Installation Guide

**Download the latest 'chat' resource:**

{% embed url="<https://github.com/citizenfx/cfx-server-data/tree/master/resources/[gameplay]/chat>" %}

After installing the **chat** resource you just need to make sure to start the scripts in the following order:

1. chat;
2. es\_extended/qb-core;
3. okokChatV2.

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config = {}

--------------------------------
-- [Discord Logs]

Config.EnableDiscordLogs = true

Config.IconURL = ""

Config.ServerName = ""

-- 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

Config.WebhookColor = "16741888"

--------------------------------
-- [Staff Groups]

Config.StaffGroups = { -- Groups that can access the different staff chats (/staff, /staffo, /sa)
	'superadmin',
	'admin',
	'mod'
}

--------------------------------
-- [General]

Config.AllowPlayersToClearTheirChat = true

Config.ClearChatCommand = 'clear'

Config.EnableHideChat = true

Config.HideChatCommand = 'hide'

Config.ShowIDOnMessage = true -- Shows the player ID on every message that is sent

Config.ShowIDOnMessageForEveryone = false -- true: shows the player ID for everyone | false: shows it only for staffs

Config.ClearChatMessageTitle = 'SYSTEM'

Config.ClearChatMessage = 'The chat has been cleared!'

-- [Date Format]

Config.DateFormat = '%H:%M' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

--------------------------------
-- [Time Out]

Config.TimeOutPlayers = true

Config.TimeOutCommand = "mute"

Config.RemoveTimeOutCommand = "unmute"

Config.ShowTimeOutMessageForEveryone = true

Config.TimeOutIcon = 'fas fa-gavel'

Config.MessageTitle = 'SERVER'

Config.TimeOutMessages = {
	['muted_for'] = '<b>{3}</b> has been muted for <b>{1}</b> minutes',
	['you_muted_for'] = 'You muted <b>{3}</b> for <b>{1}</b> minutes',
	['been_muted_for'] = 'You have been muted for <b>{0}</b> minutes',

	['you_unmuted'] = 'You unmuted <b>{2}</b>',
	['been_unmuted'] = 'You have been unmuted',

	['muted_message'] = 'You are muted for <b>{0}</b>',
	['seconds'] = ' seconds',
	['minutes'] = ' minutes',
	['hours'] = ' hours',
}

--------------------------------
-- [Me/Do/Try]

Config.Distance = 150

Config.Duration = 5000 -- Text duration (in ms)

Config.TextFont = 0 -- https://wiki.rage.mp/index.php?title=Fonts_and_Colors#DrawText_Fonts

Config.TextScale = 0.5

--------------------------------
-- [Me]

Config.EnableMe = true

Config.MeCommand = 'me'

Config.MeTextColor = { r = 100, g = 100, b = 230, a = 255 }

--------------------------------
-- [Do]

Config.EnableDo = true

Config.DoCommand = 'do'

Config.DoTextColor = { r = 100, g = 230, b = 100, a = 255 }

--------------------------------
-- [Try]

Config.EnableTry = true

Config.TryCommand = 'try'

Config.TryTextColor = { r = 230, g = 100, b = 100, a = 255 }

--------------------------------
-- [Job]

Config.JobChat = true

Config.JobCommand = 'jobc'

Config.JobIcon = 'fas fa-briefcase'

--------------------------------
-- [Private Message]

Config.EnablePM = true

Config.PMCommand = 'pm'

Config.PMIcon = 'fas fa-comment'

Config.PMMessageTitle = "PM"

--------------------------------
-- [OOC]

Config.EnableOOC = true

Config.OOCCommand = 'ooc'

Config.OOCDistance = 20.0

Config.OOCIcon = 'fas fa-door-open'

Config.OOCMessageTitle = 'OOC'

Config.OOCMessageWithoutCommand = true -- true: sends OOC message without command (/ooc) | false: doesn't send any message without it being a command

--------------------------------
-- [Staff]

Config.EnableStaffCommand = true

Config.StaffCommand = 'staff'

Config.StaffMessageTitle = 'STAFF'

Config.StaffIcon = 'fas fa-shield-alt'

Config.AllowStaffsToClearEveryonesChat = true

Config.ClearEveryonesChatCommand = 'clearall'

Config.StaffSteamName = true

Config.ShowStaffMessageWhenHidden = true

-- [Staff Only]

Config.EnableStaffOnlyCommand = true

Config.StaffOnlyCommand = 'staffo'

Config.StaffOnlyMessageTitle = 'STAFF ONLY'

Config.StaffOnlyIcon = 'fas fa-eye-slash'

Config.StaffOnlySteamName = true

-- [Server Announcement]

Config.EnableServerAnnouncement = true

Config.ServerAnnouncementCommand = 'sa'

Config.AnnouncementIcon = 'fas fa-exclamation-circle'

Config.AnnouncementMessageTitle = 'SERVER'

--------------------------------
-- [Advertisements]

Config.EnableAdvertisementCommand = true

Config.AdvertisementCommand = 'ad'

Config.AdvertisementPrice = 1000

Config.AdvertisementCooldown = 5 -- in minutes

Config.AdvertisementIcon = 'fas fa-ad'

--------------------------------
-- [Anonymous/Dark]

Config.EnableAnonymousCommand = true

Config.AnonymousCommand = 'anon'

Config.AnonymousPrice = 1000

Config.AnonymousCooldown = 5 -- in minutes

Config.WhatJobsCantSeeAnonymousChat = {
	'police',
	'ambulance',
}

Config.AnonymousIcon = 'fas fa-mask'

--------------------------------
-- [Twitch]

Config.EnableTwitchCommand = true

Config.TwitchCommand = 'twitch'

-- Types of identifiers: steam: | license: | xbl: | live: | discord: | fivem: | ip:
Config.TwitchList = {
	'steam:110000118a12j8a', -- Example, change this
}

Config.TwitchIcon = 'fab fa-twitch'

--------------------------------
-- [Youtube]

Config.EnableYoutubeCommand = true

Config.YoutubeCommand = 'youtube'

-- Types of identifiers: steam: | license: | xbl: | live: | discord: | fivem: | ip:
Config.YoutubeList = {
	'steam:110000118a12j8a', -- Example, change this
}

Config.YoutubeIcon = 'fab fa-youtube'

--------------------------------
-- [Twitter]

Config.EnableTwitterCommand = true

Config.TwitterCommand = 'twitter'

Config.TwitterIcon = 'fab fa-twitter'

--------------------------------
-- [Police]

Config.EnablePoliceCommand = true

Config.PoliceCommand = 'police'

Config.PoliceJobName = 'police'

Config.PoliceIcon = 'fas fa-bullhorn'

--------------------------------
-- [Ambulance]

Config.EnableAmbulanceCommand = true

Config.AmbulanceCommand = 'ambulance'

Config.AmbulanceJobName = 'ambulance'

Config.AmbulanceIcon = 'fas fa-ambulance'

--------------------------------
-- [Auto Message]

Config.EnableAutoMessage = true

Config.AutoMessageTime = 60 -- (in minutes) will send messages every x minutes 

Config.AutoMessages = {
	"Don't break the rules!",
	"Have fun!",
}

--------------------------------
-- [Notifications]

Config.NotificationsText = {
	['disable_chat'] = { title = 'SYSTEM', message = 'You disabled the chat', time = 5000, type = 'info'},
	['enable_chat'] = { title = 'SYSTEM', message = 'You enabled the chat', time = 5000, type = 'info'},
	['ad_success'] = { title = 'ADVERTISEMENT', message = 'Advertisement successfully made for ${price}€', time = 5000, type = 'success'},
	['ad_no_money'] = { title = 'ADVERTISEMENT', message = "You don't have enough money to make an advertisement", time = 5000, type = 'error'},
	['ad_too_quick'] = { title = 'ADVERTISEMENT', message = "You can't advertise so quickly", time = 5000, type = 'info'},
	['mute_not_adm'] = { title = 'SYSTEM', message = 'You are not an admin', time = 5000, type = 'error'},
	['mute_id_inv'] = { title = 'SYSTEM', message = 'The id is invalid', time = 5000, type = 'error'},
	['mute_time_inv'] = { title = 'SYSTEM', message = 'The mute time is invalid', time = 5000, type = 'error'},
	['alr_muted'] = { title = 'SYSTEM', message = 'This person is already muted', time = 5000, type = 'error'},
	['alr_unmuted'] = { title = 'SYSTEM', message = 'This person is already unmuted', time = 5000, type = 'error'},
	['an_success'] = { title = 'ANONYMOUS', message = 'Advertisement successfully made for price€', time = 5000, type = 'success'},
	['an_no_money'] = { title = 'ANONYMOUS', message = "You don't have enough money to make an advertisement", time = 5000, type = 'error'},
	['an_too_quick'] = { title = 'ANONYMOUS', message = "You can't advertise so quickly", time = 5000, type = 'error'},
	['an_not_allowed'] = { title = 'ANONYMOUS', message = "You are not allowed to send messages in the anonymous chat", time = 5000, type = 'error'},
	['is_muted'] = { title = 'ANONYMOUS', message = "This player is muted", time = 5000, type = 'error'},
}

Config.WebhookText = {
	['clear_all'] = 'Cleared all chats',
	['staff_msg'] = 'Staff message',
	['staff_chat_msg'] = 'Staff chat message',
	['sv_an'] = 'Server announcement',
	['ad'] = 'Advertisement',
	['twitch'] = 'Twitch',
	['youtube'] = 'Youtube',
	['twitter'] = 'Twitter',
	['police'] = 'Police',
	['ambulance'] = 'Ambulance',
	['job_chat'] = 'Job chat [${job}]',
	['pm_chat'] = 'Private Message to ${name} [${id}]',
	['ooc'] = 'OOC',
	['muted'] = 'Muted [${id}]',
	['muted_for'] = 'For ${muteTime} minutes',
	['unmuted'] = 'Unmuted [${id}]',
	['p_unmuted'] = 'Player has been unmuted',
	['anon'] = 'Anonymous',
}
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config = {}

Config.QBPermissionsUpdate = false -- set it to true if you have the latest Permissions update

--------------------------------
-- [Discord Logs]

Config.EnableDiscordLogs = true

Config.IconURL = ""

Config.ServerName = ""

-- 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

Config.WebhookColor = "16741888"

--------------------------------
-- [Staff Groups]

Config.StaffGroups = { -- Groups that can access the different staff chats (/staff, /staffo, /sa)
	'god',
	'admin',
	'mod'
}

--------------------------------
-- [General]

Config.AllowPlayersToClearTheirChat = true

Config.ClearChatCommand = 'clear'

Config.EnableHideChat = true

Config.HideChatCommand = 'hide'

Config.ShowIDOnMessage = true -- Shows the player ID on every message that is sent

Config.ShowIDOnMessageForEveryone = false -- true: shows the player ID for everyone | false: shows it only for staffs

Config.ClearChatMessageTitle = 'SYSTEM'

Config.ClearChatMessage = 'The chat has been cleared!'

-- [Date Format]

Config.DateFormat = '%H:%M' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

--------------------------------
-- [Time Out]

Config.TimeOutPlayers = true

Config.TimeOutCommand = "mute"

Config.RemoveTimeOutCommand = "unmute"

Config.ShowTimeOutMessageForEveryone = true

Config.TimeOutIcon = 'fas fa-gavel'

Config.MessageTitle = 'SERVER'

Config.TimeOutMessages = {
	['muted_for'] = '<b>{3}</b> has been muted for <b>{1}</b> minutes',
	['you_muted_for'] = 'You muted <b>{3}</b> for <b>{1}</b> minutes',
	['been_muted_for'] = 'You have been muted for <b>{0}</b> minutes',

	['you_unmuted'] = 'You unmuted <b>{2}</b>',
	['been_unmuted'] = 'You have been unmuted',

	['muted_message'] = 'You are muted for <b>{0}</b>',
	['seconds'] = ' seconds',
	['minutes'] = ' minutes',
	['hours'] = ' hours',
}

--------------------------------
-- [Job]

Config.JobChat = true

Config.JobCommand = 'jobc'

Config.JobIcon = 'fas fa-briefcase'

--------------------------------
-- [Private Message]

Config.EnablePM = true

Config.PMCommand = 'pm'

Config.PMIcon = 'fas fa-comment pm-icon'

Config.PMMessageTitle = "PM"

--------------------------------
-- [OOC/Me/Do/Try]

Config.Distance = 20.0

--------------------------------
-- [OOC]

Config.EnableOOC = true

Config.OOCCommand = 'ooc'

Config.OOCIcon = 'fas fa-door-open'

Config.OOCMessageTitle = 'OOC'

Config.OOCMessageWithoutCommand = true -- true: sends OOC message without command (/ooc) | false: doesn't send any message without it being a command

--------------------------------
-- [Me]

Config.EnableMeCommand = true

Config.MeCommand = 'me'

Config.MeIcon = 'fas fa-comment me-icon'

Config.MeMessageTitle = 'ME'

--------------------------------
-- [Do]

Config.EnableDoCommand = true

Config.DoCommand = 'do'

Config.DoIcon = 'fas fa-comment do-icon'

Config.DoMessageTitle = 'DO'

--------------------------------
-- [Try]

Config.EnableTryCommand = true

Config.TryCommand = 'try'

Config.TryIcon = 'fas fa-comment try-icon'

Config.TryMessageTitle = 'TRY'

--------------------------------
-- [Staff]

Config.EnableStaffCommand = true

Config.StaffCommand = 'staff'

Config.StaffMessageTitle = 'STAFF'

Config.StaffIcon = 'fas fa-shield-alt'

Config.AllowStaffsToClearEveryonesChat = true

Config.ClearEveryonesChatCommand = 'clearall'

Config.StaffSteamName = false

-- [Staff Only]

Config.EnableStaffOnlyCommand = true

Config.StaffOnlyCommand = 'staffo'

Config.StaffOnlyMessageTitle = 'STAFF ONLY'

Config.StaffOnlyIcon = 'fas fa-eye-slash'

Config.StaffOnlySteamName = false

-- [Server Announcement]

Config.EnableServerAnnouncement = true

Config.ServerAnnouncementCommand = 'sa'

Config.AnnouncementIcon = 'fas fa-exclamation-circle'

Config.AnnouncementMessageTitle = 'SERVER'

--------------------------------
-- [Advertisements]

Config.EnableAdvertisementCommand = true

Config.AdvertisementCommand = 'ad'

Config.AdvertisementPrice = 1000

Config.AdvertisementCooldown = 5 -- in minutes

Config.AdvertisementIcon = 'fas fa-ad'

--------------------------------
-- [Anonymous/Dark]

Config.EnableAnonymousCommand = true

Config.AnonymousCommand = 'anon'

Config.AnonymousPrice = 1000

Config.AnonymousCooldown = 5 -- in minutes

Config.WhatJobsCantSeeAnonymousChat = {
	'police',
	'ambulance',
}

Config.AnonymousIcon = 'fas fa-mask'

--------------------------------
-- [Twitch]

Config.EnableTwitchCommand = true

Config.TwitchCommand = 'twitch'

-- Types of identifiers: steam: | license: | xbl: | live: | discord: | fivem: | ip:
Config.TwitchList = {
	'steam:110000118a12j8a', -- Example, change this
}

Config.TwitchIcon = 'fab fa-twitch'

--------------------------------
-- [Youtube]

Config.EnableYoutubeCommand = true

Config.YoutubeCommand = 'youtube'

-- Types of identifiers: steam: | license: | xbl: | live: | discord: | fivem: | ip:
Config.YoutubeList = {
	'steam:110000118a12j8a', -- Example, change this
}

Config.YoutubeIcon = 'fab fa-youtube'

--------------------------------
-- [Twitter]

Config.EnableTwitterCommand = true

Config.TwitterCommand = 'twitter'

Config.TwitterIcon = 'fab fa-twitter'

--------------------------------
-- [Police]

Config.EnablePoliceCommand = true

Config.PoliceCommand = 'police'

Config.PoliceJobName = 'police'

Config.PoliceIcon = 'fas fa-bullhorn'

--------------------------------
-- [Ambulance]

Config.EnableAmbulanceCommand = true

Config.AmbulanceCommand = 'ambulance'

Config.AmbulanceJobName = 'ambulance'

Config.AmbulanceIcon = 'fas fa-ambulance'

--------------------------------
-- [Auto Message]

Config.EnableAutoMessage = true

Config.AutoMessageTime = 60 -- (in minutes) will send messages every x minutes 

Config.AutoMessages = {
	"Don't break the rules!",
	"Have fun!",
}

--------------------------------
-- [Notifications]

Config.NotificationsText = {
	['disable_chat'] = { title = 'SYSTEM', message = 'You disabled the chat', time = 5000, type = 'info'},
	['enable_chat'] = { title = 'SYSTEM', message = 'You enabled the chat', time = 5000, type = 'info'},
	['ad_success'] = { title = 'ADVERTISEMENT', message = 'Advertisement successfully made for ${price}€', time = 5000, type = 'success'},
	['ad_no_money'] = { title = 'ADVERTISEMENT', message = "You don't have enough money to make an advertisement", time = 5000, type = 'error'},
	['ad_too_quick'] = { title = 'ADVERTISEMENT', message = "You can't advertise so quickly", time = 5000, type = 'info'},
	['mute_not_adm'] = { title = 'SYSTEM', message = 'You are not an admin', time = 5000, type = 'error'},
	['mute_id_inv'] = { title = 'SYSTEM', message = 'The id is invalid', time = 5000, type = 'error'},
	['mute_time_inv'] = { title = 'SYSTEM', message = 'The mute time is invalid', time = 5000, type = 'error'},
	['alr_muted'] = { title = 'SYSTEM', message = 'This person is already muted', time = 5000, type = 'error'},
	['alr_unmuted'] = { title = 'SYSTEM', message = 'This person is already unmuted', time = 5000, type = 'error'},
	['an_success'] = { title = 'ANONYMOUS', message = 'Advertisement successfully made for price€', time = 5000, type = 'success'},
	['an_no_money'] = { title = 'ANONYMOUS', message = "You don't have enough money to make an advertisement", time = 5000, type = 'error'},
	['an_too_quick'] = { title = 'ANONYMOUS', message = "You can't advertise so quickly", time = 5000, type = 'error'},
	['an_not_allowed'] = { title = 'ANONYMOUS', message = "You are not allowed to send messages in the anonymous chat", time = 5000, type = 'error'},
	['is_muted'] = { title = 'ANONYMOUS', message = "This player is muted", time = 5000, type = 'error'},
}

Config.WebhookText = {
	['clear_all'] = 'Cleared all chats',
	['staff_msg'] = 'Staff message',
	['staff_chat_msg'] = 'Staff chat message',
	['sv_an'] = 'Server announcement',
	['ad'] = 'Advertisement',
	['twitch'] = 'Twitch',
	['youtube'] = 'Youtube',
	['twitter'] = 'Twitter',
	['police'] = 'Police',
	['ambulance'] = 'Ambulance',
	['job_chat'] = 'Job chat [${job}]',
	['pm_chat'] = 'Private Message to ${name} [${id}]',
	['ooc'] = 'OOC',
	['me'] = 'ME',
	['do'] = 'DO',
	['try'] = 'TRY',
	['muted'] = 'Muted [${id}]',
	['muted_for'] = 'For ${muteTime} minutes',
	['unmuted'] = 'Unmuted [${id}]',
	['p_unmuted'] = 'Player has been unmuted',
	['anon'] = 'Anonymous',
}
```

{% endtab %}
{% endtabs %}


# Export

{% tabs %}
{% tab title="Client" %}

```lua
exports['okokChatV2']:Message(background, color, icon, title, playername, message, target, image)
```

{% endtab %}

{% tab title="Server" %}

```lua
TriggerEvent('okokChat:ServerMessage', background, color, icon, title, playername, message, target, image)
```

{% endtab %}
{% endtabs %}

#### Variables:

**background**: `'linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(53, 219, 194, 0.9) 100%)'`

**color**: `'#35dbc2'`

**icon**: `'fas fa-briefcase'`

**title**: `'Example'`

**playername**: `'Cristiano Ronaldo'`

**message**: `'Thank you for playing in our server'`

**target**: receiver `source` or `-1` for everyone

**image**: `'https://i.imgur.com/OebRLaT.jpeg'`

{% hint style="info" %}
The icon is from: <https://fontawesome.com/icons>
{% endhint %}


# okokBilling

[**YouTube Video**](https://www.youtube.com/watch?v=9gXfTvyzzEI)

## Installation Guide

In case you had the previous okokBilling version (both ESX & QBCore) execute the code below in your database, otherwise ignore it.

```sql
DROP TABLE okokbilling;
```

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokbilling` (
    `id` int NOT NULL AUTO_INCREMENT,
    `ref_id` varchar(10) NOT NULL,
    `receiver_identifier` varchar(255) NOT NULL,
    `receiver_name` varchar(255) NOT NULL,
    `author_identifier` varchar(255) NOT NULL,
    `author_name` varchar(255) NOT NULL,
    `society` varchar(255) NOT NULL,
    `society_name` varchar(255) NOT NULL,
    `item` varchar(255) NOT NULL,
    `invoice_value` int NOT NULL,
    `fees_amount` int NOT NULL,
    `status` varchar(50) NOT NULL,
    `notes` LONGTEXT DEFAULT ' ',
    `sent_date` varchar(255) NOT NULL,
    `limit_pay_date` varchar(255) NOT NULL,
    `paid_date` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
);
```

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Debug = false -- This help find the source of a problem 

Config.OnlyUnpaidCityInvoices = false

Config.OnlyUnpaidSocietyInvoices = false

Config.EventPrefix = 'okokBilling'

Config.Locale = 'en'

Config.DatabaseTable = 'okokbilling'

Config.OpenMenuKey = 168 -- Default 168 (F7)

Config.OpenMenuCommand = 'invoices' -- Command to open the menu

Config.InvoiceDistance = 15

Config.AllowPlayersInvoice = true -- if players can create Player to Player invoices

Config.okokRequests = false -- Player to Player invoices only, to avoid abuse

Config.UseOKOKBankingTransactions = false -- If set to true it will register the bills to okokBanking transactions

Config.AuthorReceivesAPercentage = true -- When sending a society invoice

Config.AuthorPercentage = 10 -- Percentage that the invoice author receives

Config.VATPercentage = 23

Config.SocietyReceivesLessWithVAT = false

Config.AddonAccount = true -- If set to true it will use the addon_account_data table in the database, if set to false it will use the okokBanking tables

Config.SocietyHasSocietyPrefix = true -- *Do not touch this if the resource is working correctly* If set to true it'll search for `society_police` (example) when paying a society invoice

Config.AutoDeletePaidInvoices = true -- true: Deletes paid invoices (to reduce lag) | false: Doesn't delete paid invoices.

Config.DeletePaidInvoicesEvery = 30 -- How often it should delete the paid invoices (in minutes)

Config.AuthorReceiveNotification = false -- If set to true it will send a notification to the author when the invoice is paid

-- Autopay

Config.UseAutoPay = true

Config.DefaultLimitDate = 7 -- Days for limit pay date

Config.CheckForUnpaidInvoicesEvery = 30 -- minutes

Config.FeeAfterEachDay = true

Config.FeeAfterEachDayPercentage = 5

-- Autopay

Config.JobsWithCityInvoices = { -- Which jobs have City Invoices (They will be allowed to delete any invoice) | Admins will have access by default
	'court'
}

Config.CityInvoicesAccessRanks = { -- Which jobs have City Invoices (They will be allowed to delete any invoice)
	'' -- All of them have access
}

Config.AllowedSocieties = { -- Which societies can access the Society Invoices
	'police',
	'ambulance'
}

Config.InspectCitizenSocieties = { -- Which societies can access the Society Invoices
	'police'
}

Config.SocietyAccessRanks = { -- Which ranks of the society have access to Society Invoices and City Invoices
	'boss',
	'chief',
}

Config.BillsList = {
	['police'] = {
		{'High Speed', 550},
		{'Parking on bridge', 1200},
		{'Jumping a red light', 250},
		{'Driving dangerously', 750},
		{'Reckless driving', 1000},
		{'Custom'}, -- If set without a price it'll let the players create a custom invoice (custom price)
	},
	['ambulance'] = {
		{'Ambulance Ride', 550},
		{'Medical treatment 1', 750},
		{'Medical treatment 2', 1200},
		{'Medical treatment 3', 250},
		{'Medical treatment 4', 400},
	},
}

Config.AdminGroups = {
	'superadmin',
	'admin',
	'mod',
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to sv_utils.lua, line 5

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.CreatePersonalInvoiceWebhookColor = '65535'

Config.CreateJobInvoiceWebhookColor = '16776960'

Config.CancelInvoiceWebhookColor = '16711680'

Config.PayInvoiceWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)

function _L(id) 
	if Locales[Config.Locale][id] then 
		return Locales[Config.Locale][id] 
	else 
		print('Locale '..id..' doesn\'t exist') 
	end 
end
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Debug = false -- This help find the source of a problem 

Config.OnlyUnpaidCityInvoices = false

Config.OnlyUnpaidSocietyInvoices = false

Config.EventPrefix = 'okokBilling'

Config.Locale = 'en'

Config.DatabaseTable = 'okokbilling'

Config.OpenMenuKey = 168 -- Default 168 (F7)

Config.OpenMenuCommand = 'invoices' -- Command to open the menu

Config.UseOKOKNotify = true -- If set to true it will use okokNotify, if set to false it will use the QB notify

Config.UseOKOKBankingTransactions = false -- If set to true it will register the bills to okokBanking transactions

Config.InvoiceDistance = 15

Config.AllowPlayersInvoice = true -- if players can create Player to Player invoices

Config.okokRequests = false -- Player to Player invoices only, to avoid abuse

Config.AuthorReceivesAPercentage = true -- When sending a society invoice

Config.AuthorPercentage = 10 -- Percentage that the invoice author receives

Config.VATPercentage = 23

Config.SocietyReceivesLessWithVAT = false

Config.QBManagement = true -- If set to true it will use the qb-management resource, if set to false it will use the okokBanking database tables

Config.UseQBBanking = false -- Useful for latest QBCore versions

Config.SocietyHasSocietyPrefix = false -- *Do not touch this if the resource is working correctly* If set to true it'll search for `society_police` (example) when paying a society invoice

Config.AutoDeletePaidInvoices = true -- true: Deletes paid invoices (to reduce lag) | false: Doesn't delete paid invoices.

Config.DeletePaidInvoicesEvery = 30 -- How often it should delete the paid invoices (in minutes)

Config.AuthorReceiveNotification = false -- If set to true it will send a notification to the author when the invoice is paid

-- Autopay

Config.UseAutoPay = true

Config.DefaultLimitDate = 7 -- Days for limit pay date

Config.CheckForUnpaidInvoicesEvery = 30 -- minutes

Config.FeeAfterEachDay = true

Config.FeeAfterEachDayPercentage = 5

-- Autopay

Config.JobsWithCityInvoices = { -- Which jobs have City Invoices (They will be allowed to delete any invoice) | Admins will have access by default
	'court'
}

Config.CityInvoicesAccessRanks = { -- Which jobs have City Invoices (They will be allowed to delete any invoice)
	'' -- All of them have access
}

Config.AllowedSocieties = { -- Which societies can access the Society Invoices
	'police',
	'ambulance'
}

Config.InspectCitizenSocieties = { -- Which societies can access the Society Invoices
	'police'
}

Config.SocietyAccessRanks = { -- Which ranks of the society have access to Society Invoices and City Invoices
	'Boss',
	'Chief',
}

Config.BillsList = {
	['police'] = {
		{'High Speed', 550},
		{'Parking on bridge', 1200},
		{'Jumping a red light', 250},
		{'Driving dangerously', 750},
		{'Reckless driving', 1000},
		{'Custom'}, -- If set without a price it'll let the players create a custom invoice (custom price)
	},
	['ambulance'] = {
		{'Ambulance Ride', 550},
		{'Medical treatment 1', 750},
		{'Medical treatment 2', 1200},
		{'Medical treatment 3', 250},
		{'Medical treatment 4', 400},
	},
}

Config.AdminGroups = {
	'god',
	'admin',
	'mod',
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to sv_utils.lua, line 3

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.CreatePersonalInvoiceWebhookColor = '65535'

Config.CreateJobInvoiceWebhookColor = '16776960'

Config.CancelInvoiceWebhookColor = '16711680'

Config.PayInvoiceWebhookColor = '65280'

-------------------------- LOCALES (DON'T TOUCH)

function _L(id) 
	if Locales[Config.Locale][id] then 
		return Locales[Config.Locale][id] 
	else 
		print('Locale '..id..' doesn\'t exist') 
	end 
end
```

{% endtab %}
{% endtabs %}


# Snippets

### Create custom invoices

```lua
TriggerServerEvent("okokBilling:CreateCustomInvoice", target, price, reason, invoiceSource, society, societyName, authorIdentifier)
```

#### Variables:

**target**: `xTarget.source`

**price**: `500`

**reason**: `Speeding`

**invoiceSource**: `Highway Radar`

**society**: `police` (you can remove this in case you want no society to receive money)

**societyName:** `LSPD` (you can remove this in case you want no society to receive money)

### Event to open the My Invoices menu (client side)

```lua
TriggerEvent("okokBilling:ToggleMyInvoices")
```

### Event to open the Create Invoice menu (client side)

```lua
TriggerEvent("okokBilling:ToggleCreateInvoice")
```


# okokCrafting

[**YouTube Video**](https://www.youtube.com/watch?v=dFqGhPZaLKg)

## Installation Guide

#### Execute the following SQL code in your database:

In case you had the previous okokCrafting version (both ESX & QBCore) execute the code below, otherwise ignore it.

```sql
ALTER TABLE users DROP COLUMN xp;
```

**ESX**

```sql
ALTER TABLE users ADD COLUMN xp LONGTEXT NULL;
ALTER TABLE users ADD COLUMN okokcrafts LONGTEXT NULL;
```

**QBCore**

```sql
ALTER TABLE players ADD COLUMN xp LONGTEXT NULL;
ALTER TABLE players ADD COLUMN okokcrafts LONGTEXT NULL;
```

### Important

The `tableID` field on the config file is used to create the crafting buttons, so make sure you **ALWAYS set a different ID for each table**.

### Adding images to the items

To add images to the items simply drop them in **okokCrafting/web/icons**.

* The images should be in the **PNG** format;
* The image name should be the same as the item ID, if the item ID is "**bread**", then the image should be "**bread.png**".

### SetLevel Export

```lua
exports['okokCrafting']:SetLevel(target, level, workbenchID)
```

If you have `Config.SameLevelForAllTables` set to true then you don't need to set the workbenchID.

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

{% tabs %}
{% tab title="ESX" %}

```lua
Config, Locales = {}, {}

Config.Debug = false -- This will print multiple steps in the console, useful to find when an error happens

Config.DoubleXP = false

Config.EventPrefix = 'okokCrafting'

Config.xpColumnsName = 'xp'

Config.craftQueryColumnName = 'okokcrafts'

Config.ESXPrefix = 'esx'

Config.getSharedObject = 'getSharedObject'

Config.Locale = 'en' -- en / pt / gr / fr / de

Config.UseOkokTextUI = true -- true = okokTextUI (I recommend you using this since it is way more optimized than the default ShowHelpNotification) | false = ShowHelpNotification

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.HideMinimap = true -- If true it'll hide the minimap when the Crafting menu is opened

Config.ShowBlips = true -- If true it'll show the crafting blips on the map

Config.ShowFloorBlips = true -- If true it'll show the crafting markers on the floor

Config.ShowAllCrafts = true -- This option will show all crafts even if you don't have enough level to craft it

Config.UseXP = true -- If you want to use the XP system or not

Config.SameLevelForAllTables = false -- Use the same level in all the crafting tables

Config.MaxLevel = 20 -- Max level on the workbenches

Config.StartXP = 100 -- First level XP

Config.LevelMultiplier = 1.05 -- How much the XP needed increases per level (1.05 = 5% | level 1 = 100 | level 2 = 205 | etc...)

Config.GiveXPOnCraftFailed = true -- If the player receives XP when he fails the craft of an item

Config.SetXPCommand = 'setcraftxp' -- Set the players XP

Config.SetLevelCommand = 'setcraftlevel' -- Set the players level

Config.CraftRadius = 5 -- if you are further it will stop the craft

Config.MaxCraftsPerWorkbench = 10 -- how many items can be in the queue at the same time

Config.UseCategories = true

Config.InventoryDirectory = 'esx_inventoryhud/html/img/items'

Config.UseOx_inventory = false

Config.NotInterectableTables = false -- true = all blips will disapear and you can only open the crafting table using the `openClosestTable` or `openWorkbench` events

Config.AdminGroups = {
	'superadmin',
	'admin',
	'mod'
}

Config.itemNames = { -- Format: id = label | In case the item starts with a number make sure to set it in this format: ['9mm'] = 9mm ammo,
	metalscrap = 'Metal Scrap',
	weapon_assaultrifle = 'Assault Rifle',
	iron = 'Iron',
	bandage = 'Bandage',
	medikit = 'First Aid',
	['10kgoldchain'] = '10kgoldchain',
	plastic = 'Plastic',
	copper = 'Copper',
	aluminum = 'Aluminum',
	money = 'Money',
}

Config.Crafting = {
	{
		coordinates = vector3(-809.4, 190.3, 72.5), -- coordinates of the table
		radius = 1, -- radius of the table
		showMapBlip = true,
		marker = {type = 20, r = 31, g = 94, b = 255, a = 155, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0},
		showBlipRadius = 50,
		blip = {blipId = 89, blipColor = 3, blipScale = 0.9, blipText = 'Crafting'}, -- to get blips and colors check this: https://wiki.gtanet.work/index.php?title=Blips
		tableName = 'General', -- Title
		tableID = 'general1', -- make a different one for every table with NO spaces
		crafts = { -- What items are available for crafting and the recipe
			'rifle', -- Recipe id
			'firstaid',
		},
		jobs = { -- What jobs are able to open the workbench
			['police'] = {
				['all'] = true,
			},
			['ambulance'] = {
				['boss'] = true,
				['chief'] = true,
			},
		},
	},
	{
		coordinates = vector3(-817.0, 182.8, 72.3),
		radius = 1,
		showMapBlip = true,
		marker = {type = 20, r = 31, g = 94, b = 255, a = 155, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0},
		showBlipRadius = 50,
		blip = {blipId = 89, blipColor = 3, blipScale = 0.9, blipText = 'Crafting'},
		tableName = 'Weapons',
		tableID = 'general2',
		crafts = {
			'firstaid',
		},
		jobs = {
			['all'] = true -- For everyone to be able to open the workbench
		},
	},
}

Config.Crafts = {
	['rifle'] = {
		item = 'weapon_assaultrifle', -- Item id and name of the image
		amount = 1, -- Amount of the item the player will receive
		maxCraft = 1, -- Max amount of crafts at a time
		successCraftPercentage = 75, -- Percentage of successful craft 0 = 0% | 50 = 50% | 100 = 100%
		isItem = false, -- if true = is item | if false = is weapon
		isDisassemble = false, -- true = disassemble | false = craft
		time = 6, -- Time to craft (in seconds)
		levelNeeded = 2, -- What level he needs to craft this item
		xpPerCraft = 40, -- How much XP he receives after crafting this item
		recipe = { -- Recipe to craft it
			{'iron', 1, true, false}, -- item/amount/if the item should be removed when crafting/if it's money
			{'money', 2000, true, true},
		},
		job = { -- What jobs can craft this item in this workbench
			''
		},
		data = {}, -- Used to pass additional data, such as metadata
		category = 'Weapons', -- Used as ID and Name of the category
	},
	['firstaid'] = {
		item = 'medikit',
		amount = 1,
		maxCraft = 10,
		successCraftPercentage = 75,
		isItem = true,
		isDisassemble = false,
		time = 3,
		levelNeeded = 0,
		xpPerCraft = 15,
		recipe = {
			{'bandage', 4, true, false},
		},
		job = {
			''
		},
		data = {}, -- Used to pass additional data, such as metadata
		category = 'Health',
	},
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to server.lua, line 3

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.StartCraftWebhookColor = '16127'

Config.CancelWebhookColor = '16776960'

Config.ClaimCraftWebhookColor = '65352'

Config.FailedCraftWebhookColor = '16711680'

-------------------------- LOCALES (DON'T TOUCH)

function _L(id) 
	if Locales[Config.Locale][id] then 
		return Locales[Config.Locale][id] 
	else 
		print('Locale '..id..' doesn\'t exist') 
	end 
end

--
```

{% endtab %}

{% tab title="QBCore" %}

```lua
Config, Locales = {}, {}

Config.Debug = false -- This will print multiple steps in the console, useful to find when an error happens

Config.DoubleXP = false

Config.EventPrefix = 'okokCrafting'

Config.xpColumnsName = 'xp'

Config.craftQueryColumnName = 'okokcrafts'

Config.qbPrefix = 'qb'

Config.QBCorePrefix = 'QBCore'

Config.Locale = 'en' -- en / pt / gr / fr / de

Config.UseOkokTextUI = true -- true = okokTextUI (I recommend you using this since it is way more optimized than the default ShowHelpNotification) | false = ShowHelpNotification

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.HideMinimap = true -- If true it'll hide the minimap when the Crafting menu is opened

Config.ShowBlips = true -- If true it'll show the crafting blips on the map

Config.ShowFloorBlips = true -- If true it'll show the crafting markers on the floor

Config.ShowAllCrafts = true -- This option will show all crafts even if you don't have enough level to craft it

Config.UseXP = true -- If you want to use the XP system or not

Config.SameLevelForAllTables = false -- Use the same level in all the crafting tables

Config.MaxLevel = 20 -- Max level on the workbenches

Config.StartXP = 100 -- First level XP

Config.LevelMultiplier = 1.05 -- How much the XP needed increases per level (1.05 = 5% | level 1 = 100 | level 2 = 205 | etc...)

Config.GiveXPOnCraftFailed = true -- If the player receives XP when he fails the craft of an item

Config.SetXPCommand = 'setcraftxp' -- Set the players XP

Config.SetLevelCommand = 'setcraftlevel' -- Set the players level

Config.CraftRadius = 5 -- if you are further it will stop the craft

Config.MaxCraftsPerWorkbench = 10 -- how many items can be in the queue at the same time

Config.UseCategories = true

Config.InventoryDirectory = 'qb-inventory/html/images'

Config.UseOx_inventory = false

Config.NotInterectableTables = false -- true = all blips will disapear and you can only open the crafting table using the `openClosestTable` or `openWorkbench` events

Config.AdminGroups = {
	'god',
	'admin',
	'mod'
}

Config.itemNames = { -- Format: id = label | In case the item starts with a number make sure to set it in this format: ['9mm'] = 9mm ammo,
	metalscrap = 'Metal Scrap',
	weapon_assaultrifle = 'Assault Rifle',
	iron = 'Iron',
	bandage = 'Bandage',
	firstaid = 'First Aid',
	['10kgoldchain'] = '10kgoldchain',
	plastic = 'Plastic',
	copper = 'Copper',
	aluminum = 'Aluminum',
	iron = 'Iron',
	cash = 'Money',
}

Config.Crafting = {
	{
		coordinates = vector3(-809.4, 190.3, 72.5), -- coordinates of the table
		radius = 1, -- radius of the table
		showMapBlip = true,
		marker = {type = 20, r = 31, g = 94, b = 255, a = 155, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0},
		showBlipRadius = 50,
		blip = {blipId = 89, blipColor = 3, blipScale = 0.9, blipText = 'Crafting'}, -- to get blips and colors check this: https://wiki.gtanet.work/index.php?title=Blips
		tableName = 'General', -- Title
		tableID = 'general1', -- make a different one for every table with NO spaces
		crafts = { -- What items are available for crafting and the recipe
			'rifle', -- Recipe id
			'firstaid',
		},
		jobs = { -- What jobs are able to open the workbench
			['police'] = {
				['boss'] = true,
				['chief'] = true,
			},
			['ambulance'] = {
				['boss'] = true,
				['chief'] = true,
			},
		},
	},
	{
		coordinates = vector3(-817.0, 182.8, 72.3),
		radius = 1,
		showMapBlip = true,
		marker = {type = 20, r = 31, g = 94, b = 255, a = 155, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0},
		showBlipRadius = 50,
		blip = {blipId = 89, blipColor = 3, blipScale = 0.9, blipText = 'Crafting'},
		tableName = 'Weapons',
		tableID = 'general2',
		crafts = {
			'firstaid',
		},
		jobs = {
			['all'] = true -- For everyone to be able to open the workbench
		},
	},
}

Config.Crafts = {
	['rifle'] = {
		item = 'weapon_assaultrifle', -- Item id and name of the image
		amount = 1, -- Amount of the item the player will receive
		maxCraft = 1, -- Max amount of crafts at a time
		successCraftPercentage = 75, -- Percentage of successful craft 0 = 0% | 50 = 50% | 100 = 100%
		isItem = true, -- if true = is item | if false = is weapon
		isDisassemble = false, -- true = disassemble | false = craft
		time = 6, -- Time to craft (in seconds)
		levelNeeded = 2, -- What level he needs to craft this item
		xpPerCraft = 40, -- How much XP he receives after crafting this item
		recipe = { -- Recipe to craft it
			{'iron', 1, true, false}, -- item/amount/if the item should be removed when crafting/if it's money
			{'cash', 2000, true, true},
		},
		job = { -- What jobs can craft this item in this workbench
			''
		},
		data = {}, -- Used to pass additional data, such as metadata
		category = 'Weapons', -- Used as ID and Name of the category
	},
	['firstaid'] = {
		item = 'firstaid',
		amount = 1,
		maxCraft = 10,
		successCraftPercentage = 75,
		isItem = true,
		isDisassemble = false,
		time = 3,
		levelNeeded = 0,
		xpPerCraft = 15,
		recipe = {
			{'bandage', 4, true, false},
		},
		job = {
			''
		},
		data = {}, -- Used to pass additional data, such as metadata
		category = 'Health',
	},
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to server.lua, line 3

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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

Config.StartCraftWebhookColor = '16127'

Config.CancelWebhookColor = '16776960'

Config.ClaimCraftWebhookColor = '65352'

Config.FailedCraftWebhookColor = '16711680'

-------------------------- LOCALES (DON'T TOUCH)

function _L(id) 
	if Locales[Config.Locale][id] then 
		return Locales[Config.Locale][id] 
	else 
		print('Locale '..id..' doesn\'t exist') 
	end 
end

--
```

{% endtab %}
{% endtabs %}


# okokContract

[**YouTube Video**](https://www.youtube.com/watch?v=8Cdhmih1Few)

## Installation Guide

**ESX**

Execute the following SQL code in your database:

```sql
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('contract', 'Contract', 1);
```

**QBCore**

Navigate to **qb-core/shared/items.lua** and add the following code to it:

```lua
['contract'] = {['name'] = 'contract', ['label'] = 'Contract', ['weight'] = 1, ['type'] = 'item', ['image'] = 'contract.png', ['unique'] = true, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'A contract'},
```

### Changing the vehicle name that appears on the contract interface

Open the `vehicles.meta` file of the desired vehicle, you should change the **\<gameName>**.

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```lua
Config, Locales = {}, {}

Config.Debug = false

Config.Locale = 'en' -- Choose the language of the script (en)

Config.EventPrefix = 'okokContract' -- The event prefix that will be used on the script

Config.okokVehicleSalesEventPrefix = "okokVehicleSales" -- okokVehicleSales event prefix (if you are using okokVehicleSales)

Config.OwnedVehiclesTable = 'owned_vehicles' -- The table that contains the owned vehicles

Config.RemoveContractAfterUse = true -- Choose if you want to keep the item after the player uses it

Config.RemoveMoneyOnSign = true -- Set if you want the script to automatically remove the money from the buyer's bank account and deposit it into the seller's account when the buyer signs it

Config.Currency = '€' -- The currency used on the script

Config.CurrencyOnLeft = false -- true = The currency symbol will be in the left side | false = On the right side on UI

Config.Item = 'contract' -- The item that will be used to sign the contract

Config.DateFormat = '%d-%m-%Y' -- (Date that appears in the contract interface) To change the date format check this website - https://www.lua.org/pil/22.1.html

Config.BlacklistedVehicles = { -- All the vehicles that are not allowed to be sold (check the gameName on vehicles.meta -> <gameName>Supra</gameName>)
	'T20',
}

Config.ContractDistance = 3.0 -- The distance that the player needs to be near the vehicle to open the contract interface

Config.UseOkokNotify = true -- If true okokNotify will be used instead of QBCore.Functions.Notify

Config.UseOkokRequests = false -- If true okokRequests will popup before opening the contract interface

Config.UseOkokBankingTransactions = false -- If true a transaction will be registered in okokBanking

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to server.lua, line 5

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.WebhookDateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- 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.html45518a

Config.sellVehicleWebhookColor = '65352'

-------------------------- LOCALES (DON'T TOUCH)
	
function _okok(id)
	if Locales[Config.Locale][id] then
		return Locales[Config.Locale][id]
	else
		print("The locale '"..id.."' doesn't exist!")
	end
end
```


# okokTalkToNPC

[**YouTube Video**](https://www.youtube.com/watch?v=JW8wwXcOr2E)

## Installation Guide

**okokTalkToNPC** is a simple script, so there isn't much to explain, just configure the config file to your liking.

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```lua
Config = {}

Config.Key = 38 -- [E] Key to open the interaction, check here the keys ID: https://docs.fivem.net/docs/game-references/controls/#controls

Config.AutoCamPosition = true -- If true it'll set the camera position automatically

Config.AutoCamRotation = true -- If true it'll set the camera rotation automatically

Config.HideMinimap = true -- If true it'll hide the minimap when interacting with an NPC

Config.UseOkokTextUI = true -- If true it'll use okokTextUI 

Config.CameraAnimationTime = 1000 -- Camera animation time: 1000 = 1 second

Config.TalkToNPC = {
	{
		npc = 'u_m_y_abner', 										-- Website too see peds name: https://wiki.rage.mp/index.php?title=Peds
		header = 'Employee of the', 								-- Text over the name
		name = 'Pacific Bank', 										-- Text under the header
		uiText = "Pacific Bank's Employee",							-- Name shown on the notification when near the NPC
		dialog = 'Hey, how can I help you?',						-- Text showm on the message bubble 
		coordinates = vector3(254.17, 222.8, 105.3), 				-- coordinates of NPC
		heading = 160.0,											-- Heading of NPC (needs decimals, 0.0 for example)
		camOffset = vector3(0.0, 0.0, 0.0), 						-- Camera position relative to NPC 	| (only works if Config.AutoCamPosition = false)
		camRotation = vector3(0.0, 0.0, 0.0),						-- Camera rotation 					| (only works if Config.AutoCamRotation = false)
		interactionRange = 2.5, 									-- From how far the player can interact with the NPC
		options = {													-- Options shown when interacting (Maximum 6 options per NPC)
			{'Where is the toilet?', 'okokTalk:toilet', 'c'},		-- 'c' for client
			{'How can I rob the bank?', 'okokTalk:rob', 'c'},		-- 's' for server (if you write something else it'll be server by default)
			{"I want to access my safe.", 'okokTalk:safe', 'c'}, 
			{"I want to make a new credit card.", 'okokTalk:card', 'c'}, 
			{"I lost my credit card.", 'okokTalk:lost', 'c'}, 
			{"Is Jennifer working?", 'okokTalk:jennifer', 'c'}, 
		},
		jobs = {													-- Jobs that can interact with the NPC
			
		},
	},
	--[[
	-- This is the template to create new NPCs
	{
		npc = "",
		header = "",
		name = "",
		uiText = "",
		dialog = "",
		coordinates = vector3(0.0, 0.0, 0.0),
		heading = 0.0,
		camOffset = vector3(0.0, 0.0, 0.0),
		camRotation = vector3(0.0, 0.0, 0.0),
		interactionRange = 0,
		options = {
			{"", 'client:event', 'c'},
			{"", 'client:event', 'c'},
			{"", 'client:event', 'c'}, 
			{"", 'server:event', 's'}, 
			{"", 'server:event', 's'}, 
			{"", 'server:event', 's'}, 
		},
		jobs = {	-- Example jobs
			'police',
			'ambulance',
		},
	},
	]]--
}
```


# okokReports

[**YouTube Video**](https://www.youtube.com/watch?v=aAKUFDSRVKc)

## **Installation Guide**

#### Execute the following SQL code in your database:

```sql
CREATE TABLE `okokreports`(
    `admin_identifier` varchar(255) NOT NULL,
    `responded_reports` varchar(255) NOT NULL DEFAULT 1,
    UNIQUE KEY abc_ndx (admin_identifier)
);
```

If you're using **ESX**, ignore this part, if you're using **QBCore**, go to the `fxmanifest.lua` file and change:

```lua
'@mysql-async/lib/MySQL.lua',
-- '@oxmysql/lib/MySQL.lua',
```

To:

```lua
-- '@mysql-async/lib/MySQL.lua',
'@oxmysql/lib/MySQL.lua',
```

### Set the Discord Webhook URLs (to enable logs)

Navigate to the `sv_utils.lua` file and paste the webhook URL in the lines 16, 18, 20, 22 and 24.

[How to create a Discord Webhook URL](https://ahsda89sgdh18923asd.gitbook.io/main/others/discord-webhook)

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```lua
Config = {}

Config.Debug = false

Config.Framework = 'ESX' -- ESX / QB / STANDALONE

Config.UseNewStaffCheckMethod = false -- **QBCORE and ESX ONLY** true = will check if a player is staff in another way (this could fix problems with /repots command)

Config.QBPermissionsUpdate = false -- **QBCORE ONLY** - set it to true if you have the latest Permissions update

Config.ReportCommand = 'report' -- command for players to create a report

Config.AdminReportCommand = 'reports' -- command for admins to check the reports

Config.NotificationToggleCommand = 'rn' -- command to toggle the notifications

Config.UseSteamNames = false -- Uses the steam names insted of game names

Config.SaveRespondedReports = false -- This will save how many reports the admins complete in the database (for this you need to use the sql file and set your sql script in the fxmanifest.lua)

Config.Database = 'mysql-async' -- mysql-async / oxmysql / ghmattimysql (Used if Config.SaveRespondedReports is set to true)

Config.NoAdminAssistingText = 'None'

Config.TeleportBackAfterConcluding = true

Config.NewReportNotifyType = 'STANDALONE' -- QB or STANDALONE

Config.LatestSendNotifyToAdmin = true

Config.GetAllPlayersForNotify = false

Config.ReportCategoriesTranslation = { -- Translate report categories
	player = "REPORT PLAYER",
	bug = "BUG",
	question = "QUESTION"
}

Config.AdminGroups = { -- Used for ESX and QB
	'god',
	'superadmin',
	'admin',
	'mod'
}

-- Used to set the admins when using the STANDALONE version
-- Types of identifiers: steam: | license: | xbl: | live: | discord: | fivem: | ip:
Config.StandaloneStaffIdentifiers = { 
	'license:9asg8d9812g3989as8dy8912398123y89123y221', -- Example, change this
	'license:09asyhhdh8912h389asgdhh912g389asgd98y123' -- Example, change this
}

Config.Notifications = {
	['success_rep'] = {title = 'REPORT', text = 'You successfully created a report', time = 5000, type = 'success'},
	['adm_answered'] = {title = 'REPORT', text = 'An admin answered you', time = 5000, type = 'info'},
	['player_answered'] = {title = 'REPORT', text = '#${id} - ${name}  answered you', time = 5000, type = 'info'},
	['adm_assist'] = {title = 'REPORT', text = 'An admin is assisting you', time = 5000, type = 'info'},
	['rep_concluded'] = {title = 'REPORT', text = 'Your report has been concluded', time = 5000, type = 'success'},
	['rep_canceled'] = {title = 'REPORT', text = 'You have canceled your report', time = 5000, type = 'error'},
	['adm_rep_concluded'] = {title = 'REPORT', text = 'Report #${id} has been concluded', time = 5000, type = 'success'},
	['new_rep'] = {title = 'REPORT', text = 'There is a new report', time = 5000, type = 'info'},
	['rep_not_on'] = {title = 'REPORT', text = 'You have turned report notifications ON!', time = 5000, type = 'success'},
	['rep_not_off'] = {title = 'REPORT', text = 'You have turned report notifications OFF!', time = 5000, type = 'error'},
	['rep_not_exist'] = {title = 'REPORT', text = 'This report does not exist!', time = 5000, type = 'error'},
}

Config.CommandSuggestions = {
	['report'] = {text = 'Command to create or check your report'},
	['adm_report'] = {text = 'Command to check opened reports'},
	['adm_notifications'] = {text = 'Command to activate/deactivate new reports notification'},
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to webhook.lua, line 1

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

Config.ReportTitle = 'REPORT'

-- 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

Config.playerReportWebhookColor = '65280'

Config.bugReportWebhookColor = '16711680'

Config.questionReportWebhookColor = '49151'

Config.playerWebhookColor = '255'

Config.adminWebhookColor = '16746240'

Config.WebhookMessages = {
	-- Player
	['player_report'] = {action = 'Opened a report'},
	['bug_report'] = {action = 'Opened a report'},
	['question_report'] = {action = 'Opened a report'},
	['p_cancel_report'] = {action = 'Canceled a report', type = 'Report #${id}'},
	['p_answer_report'] = {action = 'Player answered report', type = 'Report #${id}'},

	-- Admin
	['a_answer_report'] = {action = 'Admin answered report', type = 'Report #${id}'},
	['a_bring_report'] = {action = 'Admin brought the player', type = 'Report #${id}'},
	['a_goto_report'] = {action = 'Admin went to the player', type = 'Report #${id}'},
	['a_closed_report'] = {action = 'Admin closed a report', type = 'Report #${id}'},
}
```


# okokNotify

[**YouTube Video**](https://www.youtube.com/watch?v=xDqu0GAORwI)

## Installation Guide

### Displaying a notification

#### Client side

```lua
exports['okokNotify']:Alert('Title', 'Message', Time, 'type', playSound)
```

#### Server side

```lua
TriggerClientEvent('okokNotify:Alert', source, 'Title', 'Message', Time, 'type', playSound)
```

Time:

* 1000 = 1 second.

Types:&#x20;

* success (<mark style="color:green;">green</mark>);
* info (<mark style="color:blue;">blue</mark>);
* warning (<mark style="color:yellow;">yellow</mark>);
* error (<mark style="color:red;">red</mark>);
* phonemessage (<mark style="color:orange;">orange</mark>);
* neutral (grey).

playSound - true/false.

### Adding new colors/notification types

Navigate to the **config.lua** file and just replicate the existing examples.

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```lua
Config = {}

Config.LeftAlign = false -- true = left side | false = right side

Config.Types = {
	success = {
		highlightColor = '#47cf73', -- Any CSS color value can be used here (rgb(), rgba(), hsl(), etc)
		icon = { -- Icon names can be found at https://fontawesome.com/
			'fas',
			'fa-check-circle'
		}
	},
	info = {
		highlightColor = '#2f83ff',
		icon = {
			'fas',
			'fa-info-circle'
		}
	},
	warning = {
		highlightColor = '#ffc107',
		icon = {
			'fas',
			'fa-exclamation-circle'
		}
	},
	error = {
		highlightColor = '#dc3545',
		icon = {
			'fas',
			'fa-times-circle'
		}
	},
	phonemessage = {
		highlightColor = '#f38847',
		icon = {
			'fas',
			'fa-phone'
		}
	},
	neutral = {
		highlightColor = '#6c757d',
		icon = {
			'fas',
			'fa-keyboard'
		}
	},
	--[[example = {
		highlightColor = 'red',
		icon = 'bootstrap-fill'
	},]]--
}
```


# Snippets

### ESX

On **es\_extended/client/functions.lua** replace the `function ESX.ShowNotification` with the following one:

```lua
function ESX.ShowNotification(message, type, length)
    if GetResourceState('okokNotify') ~= 'missing' then
        if type == 'error' then
            exports['okokNotify']:Alert("Error", message, 5000, 'error')
        elseif type == 'inform' then
            exports['okokNotify']:Alert("Info", message, 5000, 'info')
        elseif type == 'success' then
            exports['okokNotify']:Alert("Success", message, 5000, 'success')
        elseif type == 'warning' then
            exports['okokNotify']:Alert("Warning", message, 5000, 'warning')
        else
            exports['okokNotify']:Alert("Info", message, 5000, 'info')
        end
    else
        print('[okokNotify]: ERROR: okokNotify resource not FOUND or not STARTED!')
    end
end
```

### QBCore

On **qb-core/client/functions.lua** replace the `function QBCore.Functions.Notify` with the following one:

```lua
function QBCore.Functions.Notify(text, textype, length)
    if textype == 'primary' then textype = 'info' end 
    local ttype = textype ~= nil and textype or "info"
    local length = length ~= nil and length or 5000
    exports['okokNotify']:Alert("", text, length, ttype)
end
```


# okokTextUI

[**YouTube Video**](https://www.youtube.com/watch?v=CGVBsQWlrLw)

## Installation Guide

#### Displaying

```lua
exports['okokTextUI']:Open('[Key] Message', 'color', 'position', playSound)
```

#### Hiding

```lua
exports['okokTextUI']:Close()
```

#### Displaying (in a loop)

```lua
exports.okokTextUI:OpenThisFrame('[Key] Message', 'color', 'position', playSound)
```

**Colors:**&#x20;

* <mark style="color:blue;">lightblue / darkblue</mark>;
* <mark style="color:green;">lightgreen / darkgreen</mark>;
* <mark style="color:red;">lightred / darkred</mark>;
* lightgrey / darkgrey.

**Positions:**

* right;
* left.

**Play sound:**

* true;
* false.

#### Example

```lua
local shown = false
local inDistance = false

while true do
    inDistance = false
    -- your code
    if playerDistance <= distance then
        inDistance = true
        -- your code when you are inside the range
    else
        -- your code when you are outside the range
    end

    if not shown and inDistance then
        exports['okokTextUI']:Open('[E] Hello', 'lightgreen', 'right', true)
        shown = true
    elseif shown and not inDistance then
        exports['okokTextUI']:Close()
        shown = false
    end
end
```

#### Example (loop)

```lua
while true do
    -- your code
    if playerDistance <= distance then
        exports['okokTextUI']:OpenThisFrame('[E] Hello', 'lightgreen', 'right', true)
        -- your code when you are inside the range
    else
        -- your code when you are outside the range
    end
end
```


# Config file

```lua
Config = {}

Config.Kinds = {
    lightblue = {
        backgroundColor = "rgba(240, 240, 240, 0.85)", --  Use any CSS color value (hexadecimal, RGB, HSL, etc)
        textColor = "#234799",
	highlightColor = "#234799",
        icon = "fa-solid fa-circle-info" -- Use any Font Awesome icon name (https://fontawesome.com/icons)
    },
    darkblue = {
        backgroundColor = "rgba(20, 20, 20, 0.85)",
        textColor = "#fff",
        highlightColor = "#2f83ff",
        icon = "fa-solid fa-circle-info"
    },
    lightgreen = {
        backgroundColor = "rgba(240, 240, 240, 0.85)",
        textColor = "#20ab4d",
        highlightColor = "#20ab4d",
        icon = "fa-solid fa-circle-info"
    },
    darkgreen = {
        backgroundColor = "rgba(20, 20, 20, 0.85)",
        textColor = "#fff",
        highlightColor = "#47cf73",
        icon = "fa-solid fa-circle-info"
    },
    lightred = {
        backgroundColor = "rgba(240, 240, 240, 0.85)",
        textColor = "#dc3545",
        highlightColor = "#dc3545",
        icon = "fa-solid fa-circle-info"
    },
    darkred = {
        backgroundColor = "rgba(20, 20, 20, 0.85)",
        textColor = "#fff",
        highlightColor = "#dc3545",
        icon = "fa-solid fa-circle-info"
    },
    lightgray = {
        backgroundColor = "rgba(240, 240, 240, 0.85)",
        textColor = "#646464",
        highlightColor = "#646464",
        icon = "fa-solid fa-circle-info"
    },
    darkgray = {
        backgroundColor = "rgba(20, 20, 20, 0.85)",
        textColor = "#fff",
        highlightColor = "#969696",
        icon = "fa-solid fa-circle-info"
    }
}
```


# Snippets

### QBCore DrawText to okokTextUI

Change the following code in **qb-core/client/drawtext.lua**:

```lua
local function hideText()
    exports['okokTextUI']:Close()
end

local function drawText(text, _)
    exports['okokTextUI']:Open(text, 'darkblue', 'right')
end

-- local function changeText(text, position) -- Can't use
--     if type(position) ~= "string" then position = "left" end

--     SendNUIMessage({
--         action = 'CHANGE_TEXT',
--         data = {
--             text = text,
--             position = position
--         }
--     })
-- end

local function keyPressed()
    CreateThread(function() -- Can't use
        --[[ SendNUIMessage({
            action = 'KEY_PRESSED',
        }) ]]
        --Wait(500)
        hideText()
    end)
end

RegisterNetEvent('qb-core:client:DrawText', function(text, position)
    drawText(text, position)
end)

-- RegisterNetEvent('qb-core:client:ChangeText', function(text, position) -- Can't use
--     changeText(text, position)
-- end)

RegisterNetEvent('qb-core:client:HideText', function()
    hideText()
end)

-- RegisterNetEvent('qb-core:client:KeyPressed', function() -- Can't use
--     keyPressed()
-- end)

exports('DrawText', drawText)
--exports('ChangeText', changeText) -- Can't use
exports('HideText', hideText)
exports('KeyPressed', keyPressed) -- Can't use
```

### **ESX.TextUI to okokTextUI**

Navigate to **es\_extended/client/functions.lua** and edit the following functions:

**ESX.TextUI**

```lua
function ESX.TextUI(message, type)
    if type == 'info' then
        type = 'darkblue' -- or `lightblue`
    elseif type == 'success' then
        type = 'darkgreen' -- or 'lightgreen'
    elseif type == 'error' then
        type = 'darkred' -- or 'lightred'
    else 
        type = 'darkgrey' -- or 'lightgrey'
    end

    if GetResourceState('okokTextUI') ~= 'missing' then
        exports['okokTextUI']:Open(message, type, "left")
    else
        print('[^1ERROR^7] ^5okokTextUI^7 is Missing!')
    end
end
```

**ESX.HideUI**

```lua
function ESX.HideUI()
    if GetResourceState("okokTextUI") ~= "missing" then
        exports["okokTextUI"]:Close()
    else 
        print("[^1ERROR^7] ^5okokTextUI^7 is Missing!")
    end
end
```


# okokRequests

[**YouTube Video**](https://www.youtube.com/watch?v=cySghkugvQU)

## Installation Guide

### Displaying a request

#### Client side

```lua
exports['okokRequests']:requestMenu(target, time, title, message, trigger, side, parameters, parametersNum)
```

#### Server side

```lua
TriggerClientEvent('okokRequests:RequestMenu', source, target, time, title, message, trigger, side, parameters, parametersNum) 
```

**Fields:**

* The **target** field defines who receives the request;
* The **time** field lets you set the time the request window will stay on the screen;
* The **title** field is where you set the request title;
* The **message** field lets you choose the message that will appear on the request window;
* The **trigger** field is where you choose the event that will be executed;
* The **side** (client/server) field allows you to choose if the trigger is client or server sided;
* The **parameters** field contains the parameters the trigger takes;
* The **parametersNum** field are the number of paramenters used.

#### Example

```lua
TriggerClientEvent('okokRequests:RequestMenu', source, tonumber(args[1]), 10000, '<i class="fas fa-question-circle"></i>&nbsp;Job Offer', 'Tommy wants to hire you.', 'client', 'parameter1,parameter2,parameter3,parameter4,parameter5', 5)
```

### Important

* The **side** field should be either `client` or `server`;
* The **parameters** field needs to be a string, all parameters need to be separated by a comma ',' and without any spaces;
* Always set the number of parameters used, in the **parametersNum** field;
* If you don't have any parameters, you don't need to add the **parameters** and the **parametersNum** field.

### Dark/light theme

To enable/disable the dark/light mode, you should go to the **scripts.js** file and navigate to the line 1, if **var darkMode** is set to **true**, the **dark theme** will be enabled, otherwise it the enabled theme will be the **light**.

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# okokDeleteVehicles

## Installation Guide

### QBCORE ONLY

If you use **QBCore** make sure to delete the **line 15** of the `fxmanifest.lua` file.

### Server artifacts

Make sure your server artifacts version is above the **5181**.

* Windows: <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>
* Linux: <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>


# Config file

```lua
Config = {}

Config.Cmd = "deletevehicles" -- Chat command to delete vehicles

Config.Framework = "esx" -- Options: "esx", "qbcore", "other"

Config.QBUsePermissionsUpdate = true

Config.AdminGroups = { -- Admin groups that can access the admin menu
	"superadmin",
	"god",
	"admin",
	"mod"
}

Config.AdminList = { -- IF YOU USE ESX OR QBCORE IGNORE THIS
	'license:2ash123ad1337a15029a21a6s4e3622f91cde1d0', -- Example, change this
	'discord:370910283901283929' -- Example, change this
}

Config.DeleteVehicleTimer = 0 -- Time (in minutes) that it will take to delete vehicles since you execute the command

Config.DeleteVehiclesIfInSafeZone = false -- If true it'll delete vehicles inside safezones

Config.DeleteVehiclesAt = { -- Delete vehicles automatically at this time every day (h = hour m = minutes)
	{['h'] = 19, ['m'] = 10},
	{['h'] = 19, ['m'] = 20},
	{['h'] = 19, ['m'] = 30},
}

-- Set safezones
-- For the blip color check: https://docs.fivem.net/docs/game-references/blips/#blip-colors
-- If you want to remove the blip simply set 'alpha' to 0
Config.SafeZones = {
	{ ['x'] = -44.155646565, ['y'] = -1100.155646565, ['z'] = 26.267009735108, ['radius'] = 50.0, ['color'] = 2, ['alpha'] = 150},
	{ ['x'] = -1688.43811035156, ['y'] = -1073.62536621094, ['z'] = 13.1521873474121, ['radius'] = 200.0, ['color'] = 2, ['alpha'] = 150},
	{ ['x'] = -2195.1352539063, ['y'] = 4288.7290039063, ['z'] = 49.173923492432, ['radius'] = 150.0, ['color'] = 2, ['alpha'] = 150},
}
```


# Discord Webhook

To create a discord webhook follow the following steps:

1. Click the **gear icon** (Edit Channel) of the channel you want to post to.
2. Click **Webhooks** in the left menu.
3. Click the **Create Webhook** button.
4. Enter a **Name** of your choice.
5. Click the **Copy** button of the **Webhook URL**.
6. Click the **Save** button.
7. Paste the **Webhook URL** in the script you want to use it.


