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

# Config

```lua
Config = {}
Config.AutoCreateTables   = true -- Set to false after first run to prevent accidental data loss. Will create missing tables on resource start if enabled.

Config.Webhooks = {
    LockerCreate    = "YOUR_WEBHOOK_URL_HERE",
    LockerOpen      = "YOUR_WEBHOOK_URL_HERE",
    ShareAccess     = "YOUR_WEBHOOK_URL_HERE",
    LockerExpand    = "YOUR_WEBHOOK_URL_HERE",
    LockerDelete    = "YOUR_WEBHOOK_URL_HERE",
    LockerRenew     = "YOUR_WEBHOOK_URL_HERE",
    LockerExpired   = "YOUR_WEBHOOK_URL_HERE",

    -- Admin webhooks
    AdminDelete     = "YOUR_WEBHOOK_URL_HERE",
    AdminOpen       = "YOUR_WEBHOOK_URL_HERE",
    AdminAccess     = "YOUR_WEBHOOK_URL_HERE",
}

Config.SendLockerOpenWebhook = true -- Set to false to disable webhook on locker open. Make false if you have a lot of locker opens and want to reduce webhook spam.
-- ─────────────────────────────────────────────────
--  Main settings
-- ─────────────────────────────────────────────────
Config.StaffCommand        = 'sblockersadmin' -- Command to open locker staff menu.
Config.StaffPermissions   = { 'god', 'admin' } -- permissions required to use staff command, if enabled

Config.NotifyType          = 'sbnotify'            -- 'qb' | 'okok' | 'sbnotify'
Config.TargetSystem        = 'qb-target'           -- 'qb-target' | 'ox_target' |
Config.Inventory          = 'qb-inventory'  -- 'qb-inventory' | 'ps-inventory' | 'codem-inventory'
Config.PaymentType        = 'cash'          -- 'cash' | 'bank'
Config.ContractDays       = 30  -- Number of days for locker rental contract
Config.ReminderDaysBefore = 5 -- Number of days before locker expiration to send reminder notification
Config.PhoneSystem        = 'qb-phone'     -- 'qb-phone' | 'lb-phone' | 'none'
Config.PhoneEmailSender   = 'sblockers@lockers.com' -- Email address shown as sender in phone notifications. Adjust to your liking.

Config.TargetDistance     = 2.0
Config.ShareDistance      = 5.0

-- ─────────────────────────────────────────────────
--  Locker settings
-- ─────────────────────────────────────────────────
Config.Locker = {
    BaseSlots      = 50,
    BaseWeight     = 10000000,      -- grams
    SlotStep       = 50,            -- Ammount of slots per expand
    WeightStep     = 1000000,      -- grams per expand step
    MaxSlots       = 500,
    MaxWeight      = 50000000,    -- grams (500 kg)
    PurchasePrice  = 5000,     -- flat purchase cost
    ExpandPrice    = 3500,     -- flat cost per expand step
    RenewalPrice   = 1500,     -- flat renewal cost per contract period
}

Config.VendorPed = {
    model    = 'mp_m_waremech_01',
    scenario = 'WORLD_HUMAN_CLIPBOARD',
}

Config.Vendors = {
    { coords = vector4(-33.864502, -1252.436523, 29.288755, 3.900572), blip = true },
    { coords = vector4(69.144783, 127.495018, 79.210983, 160.491959), blip = true },
    { coords = vector4(964.620483, -1031.194214, 40.838928, 274.389008), blip = true },
    { coords = vector4(42.037392, 6457.065430, 31.425289, 228.563156), blip = true },
}

Config.Locations = {
    {
        id     = 'underpass_garage',
        name   = 'Underpass Storage',
        locker = vector3(-44.244, -1242.096, 29.669),
        blip   = { sprite = 357, color = 5, scale = 0.75, label = 'Storage Lockers' },
    },
    {
        id     = 'gopostal_storage',
        name   = 'Go Postal Storage',
        locker = vector3(72.878, 127.619, 81.038),
        blip   = { sprite = 357, color = 5, scale = 0.75, label = 'Storage Lockers' },
    },
    {
        id     = 'vespucciblvd_storage',
        name   = 'Vespucci Blvd Storage',
        locker = vector3(962.682, -1025.411, 41.392),
        blip   = { sprite = 357, color = 5, scale = 0.75, label = 'Storage Lockers' },
    },
    {
        id     = 'paleto_storage',
        name   = 'Paleto Bay Storage',
        locker = vector3(37.680, 6454.661, 31.945),
        blip   = { sprite = 357, color = 5, scale = 0.75, label = 'Storage Lockers' },
    },
}











-- ─────────────────────────────────────────────────
--  DO NOT TOUCH BELOW UNLESS YOU KNOW WHAT YOU'RE DOING - YOU KNOW WHAT, JUST DON'T TOUCH IT
-- ─────────────────────────────────────────────────
function Config.GenerateStorageId()
    local chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    local id = ''
    for i = 1, 16 do
        local idx = math.random(1, #chars)
        id = id .. chars:sub(idx, idx)
    end
    return 'sbcs_' .. id
end

function Config.CalcExpandCost(currentSlots, currentWeight)
    local cfg = Config.Locker
    local newSlots  = math.min(currentSlots  + cfg.SlotStep,  cfg.MaxSlots)
    local newWeight = math.min(currentWeight + cfg.WeightStep, cfg.MaxWeight)
    return cfg.ExpandPrice, newSlots, newWeight
end

```
