# Accessible code

{% tabs %}
{% tab title="config.lua" %}
{% code fullWidth="true" %}

```lua
Config = {
    FrameworkName = IsESX() and 'es_extended' or 'qb-core',

    Locale = 'en',

    DebugZone = true, -- if you want to debug zones enable this, good when creating new garages so you can get how zones looks

    GangCreatorSupport = false,

    DeleteFromSQL = true, -- when sending vehicle in parts, do you want it also to be removed from sql (owned_vehicles or player_vehicles table)

    Target = 'ox_target', -- qb-target or qtarget

    Commands = {
        creator = {
            name = 'theftcreator',
            help = 'Command that helps you to create theft garage',
            restricted = 'group.admin'
        },
        delete = {
            name = 'deletetheft',
            help = 'Command that allows you to delete theft garages',
            restricted = 'group.admin'
        },
        deleteVehicle = {
            name = 'returnveh',
            help = 'Command that allows you to return vehicle to their owner',
            restricted = 'group.admin'
        },
        restore = {
            name = 'restore',
            help = 'Command that allows you to restore wanted vehicle to theft garage',
            restricted = 'group.admin'
        }
    },

    -- when you can send vehicle in parts, IN GAME CLOCK, if you dont want this put SellHours = false
    SellHours = {
        ['Mon'] = { 19, 5 }, -- from 19 to 05, MUST BE 24H FORMAT
        ['Tue'] = { 19, 5 },
        ['Wed'] = { 19, 5 },
        ['Thu'] = { 19, 5 },
        ['Fri'] = { 19, 5 },
        ['Sat'] = { 19, 5 },
        ['Sun'] = { 19, 5 },
    },

    -- vehicles that cant be stored in garage or sold
    BlackListed = {
        [`t20`] = true
    },

    -- If scipt can't find vehicles price in database then it will calculate it by their class, put down there prices that you want
    VehicleClassPrices = {
        -- These are vehicle classes
        [0] = 10000,  -- Compacts
        [1] = 10000,  -- Sedans
        [2] = 10000,  -- SUVs
        [3] = 10000,  -- Coupes
        [4] = 10000, -- Muscle
        [5] = 100000,  -- Sports Classics
        [6] = 100000, -- Sports
        [7] = 100000, -- Super
        [8] = 50000,  -- Motorcycles
        [9] = 50000,  -- Off-road
        [10] = 75000, -- Industrial
        [11] = 500, -- Utility
        [12] = 75000, -- Vans
        [13] = 100, -- Cylces
        [14] = 0, -- Boats
        [15] = 0, -- Helicopters
        [16] = 0, -- Planes
        [17] = 0, -- Service
        [18] = 0, -- Emergency
        [19] = 0, -- Military
        [20] = 10000, -- Commercial
        [21] = 0 -- Trains
    },
}

Discord = {

    url = '',  -- url here

    title = '',

    /*
        https://www.spycolor.com/

        ['default'] = 14423100,
        ['blue'] = 255,
        ['red'] = 16711680,
        ['green'] = 65280,
        ['white'] = 16777215,
        ['black'] = 0,
        ['orange'] = 16744192,
        ['yellow'] = 16776960,
        ['pink'] = 16761035,
        ['lightgreen'] = 65309,
    */

    color = 65309, -- green

    imageUrl = '', -- optional, if you dont want it put ''
}
```

{% endcode %}
{% endtab %}

{% tab title="client/editable.lua" %}

```lua
-- msg: message that will be shown 
-- type: success and error
function Notify(msg, type)
    lib.notify({
        description = msg,
        type = type
    })
end

RegisterNetEvent('uniq_theft:Notify', Notify)

-- if in contex menu vehicle is shown as NULL NULL you need to fill up this text entry
Citizen.CreateThread(function()
    -- AddTextEntry('modelName', 'label')
    -- AddTextEntry('vehicleMakeName', 'label')

    -- Example: 
    -- AddTextEntry('gtr', "Skyline GTR '17") -- For the car name itself
    -- AddTextEntry('Nissan', 'Nissan') -- For the make name (in vehicles.meta -> <vehicleMakeName>)
end)

-- your export event for giving keys
function GiveCarKeys(plate)
    
end

-- if you use something else it must have Citizen.Await for code to wait for this response, also must return true or false
function MiniGame()
    -- https://overextended.dev/ox_lib/Modules/Interface/Client/skillcheck
    local success = lib.skillCheck({'medium'}, {'w', 'a', 's', 'd'})

    return success
end
```

{% endtab %}

{% tab title="server/editable.lua" %}

```lua
local Query = {
    esx = {
        update = 'UPDATE `owned_vehicles` SET `owner` = ? WHERE `plate` = ?',
        select = 'SELECT `owner` FROM `owned_vehicles` WHERE `plate` = ?',
        delete = 'DELETE FROM `owned_vehicles` WHERE `plate` = ?'
    },

    qb = {
        update = 'UPDATE `player_vehicles` SET `citizenid` = ? WHERE `plate` = ?',
        select = 'SELECT `citizenid` FROM `player_vehicles` WHERE `plate` = ?',
        delete = 'DELETE FROM `player_vehicles` WHERE `plate` = ?'
    }
}

-- global, used also in server/main.lua
Vehicles = {}

-- this should get vehicle price from your shop, if you use something else add it here
if GetResourceState('esx_vehicleshop'):find('start') then
    local vehicles = MySQL.query.await('SELECT `name`, `price` FROM `vehicles`')

    if vehicles[1] then
        for i = 1, #vehicles do
            local data = vehicles[i]

            if data then
                Vehicles[joaat(data.name)] = data.price
            end
        end
    end
end

if IsQBCore() then
    for k,v in pairs(QBCore.Shared.Vehicles) do
        Vehicles[v.hash] = v.price
    end
end

if GetResourceState('okokVehicleShop'):find('start') then
    local vehicles = MySQL.query.await('SELECT `vehicle_id`, `min_price` FROM `okokvehicleshop_vehicles`')

    if vehicles[1] then
        for i = 1, #vehicles do
            local data = vehicles[i]

            if data then
                Vehicles[joaat(data.vehicle_id)] = data.min_price
            end
        end
    end
end

function ReturnToOwner(owner, plate)
    if IsESX() then
        MySQL.query(Query.esx.update, { owner, plate })
    elseif IsQBCore() then
        MySQL.query(Query.qb.update, { owner, plate })
    end
end

-- this is used when you are deleting theft garage and you want to return vehicles to their owners (ability to execute more queries at once)
function ReturnOwnerPrepare(parameters)
    if IsESX() then
        MySQL.prepare(Query.esx.update, parameters)
    elseif IsQBCore() then
        MySQL.prepare(Query.qb.update, parameters)
    end
end


function ReturnOwnerPrepareGang(parameters)
    MySQL.prepare('UPDATE `uniq_mafia_garage` SET `owner` = ? WHERE `plate` = ?', parameters)
end

function DeleteGang(plate)
    MySQL.query('DELETE FROM `uniq_mafia_garage` WHERE `plate` = ?', { plate })
end

function DeleteOwned(plate)
    if IsESX() then
        MySQL.query(Query.esx.delete, { plate })
    elseif IsQBCore() then
        MySQL.query(Query.qb.delete, { plate })
    end
end

lib.callback.register('uniq_theft:CheckOwner', function(source, name, plate)
    if IsESX() then
        if Garages[name].vehicles[plate] then
            return true, Garages[name].vehicles[plate].owner, Garages[name].vehicles[plate].gangVeh
        end

        local owner = MySQL.scalar.await(Query.esx.select, { plate })

        if owner then
            MySQL.update.await(Query.esx.update, { 'uniq_theft', plate })
            return true, owner, false
        end

        -- this checks if vehicle is owned by gang in our gang creator
        if GetResourceState('uniq-mafia'):find('start') then
            owner = MySQL.scalar.await('SELECT `owner` FROM `uniq_mafia_garage` WHERE `plate` = ?', { plate })

            if owner then
                MySQL.update.await('UPDATE `uniq_mafia_garage` SET `owner` = ? WHERE `plate` = ?', { 'uniq_theft', plate })
                return true, owner, true
            end
        end

        return false
    elseif IsQBCore() then
        if Garages[name].vehicles[plate] then
            return true, Garages[name].vehicles[plate].owner, Garages[name].vehicles[plate].gangVeh
        end

        local owner = MySQL.scalar.await(Query.qb.select, { plate })

        if owner then
            MySQL.update.await(Query.qb.update, { 'uniq_theft', plate })
            return true, owner, false
        end

        -- this checks if vehicle is owned by gang in our gang creator
        if GetResourceState('uniq-mafia'):find('start') then
            owner = MySQL.scalar.await('SELECT `owner` FROM `uniq_mafia_garage` WHERE `plate` = ?', { plate })

            if owner then
                MySQL.update.await('UPDATE `uniq_mafia_garage` SET `owner` = ? WHERE `plate` = ?', { 'uniq_theft', plate })
                return true, owner, true
            end
        end

        return false
    end
end)

lib.callback.register('uniq_theft:FindPrice', function(source, hash)
    if Vehicles[hash] then
        return Vehicles[hash]
    end

    return nil
end)

lib.callback.register('uniq_theft:GetJobs', function(source)
    local options = {}

    if IsESX() then
        for k,v in pairs(ESX.Jobs) do
            options[#options + 1] = { label = v.label, value = k }
        end
    elseif IsQBCore() then
        for k,v in pairs(QBCore.Shared.Jobs) do
            options[#options + 1] = { label = v.label, value = k }
        end
    end

    return options
end)

if IsQBCore() then
    lib.callback.register('uniq_theft:GetGangs', function(source)
        local options = {}

        for k,v in pairs(QBCore.Shared.Gangs) do
            options[#options + 1] = { label = v.label, value = k }
        end

        return options
    end)
end


function HasMoney(playerId, amount)
    if IsESX() then
        return ESX.GetPlayerFromId(playerId)?.getMoney() >= amount
    elseif IsQBCore() then
        return QBCore.Functions.GetPlayer(playerId)?.Functions.GetMoney('cash') >= amount
    end
end

function RemoveMoney(playerId, amount)
    if IsESX() then
        ESX.GetPlayerFromId(playerId).removeMoney(amount)
    elseif IsQBCore() then
        QBCore.Functions.GetPlayer(playerId)?.Functions.RemoveMoney('cash', amount)
    end
end

function GiveMoney(playerId, amount)
    if IsESX() then
        ESX.GetPlayerFromId(playerId).addMoney(amount)
    elseif IsQBCore() then
        QBCore.Functions.GetPlayer(playerId)?.Functions.AddMoney('cash', amount)
    end
end

function GiveReward(playerId, reward, amount)
    if IsESX() then
        ESX.GetPlayerFromId(playerId)?.addInventoryItem(reward, amount)
    elseif IsQBCore() then
        QBCore.Functions.GetPlayer(playerId)?.Functions.AddMoney('cash', amount)
    end
end
```

{% endtab %}
{% endtabs %}
