1105 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			1105 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
QBCore.Functions = {}
 | 
						|
 | 
						|
-- Callbacks
 | 
						|
 | 
						|
function QBCore.Functions.CreateClientCallback(name, cb)
 | 
						|
    QBCore.ClientCallbacks[name] = cb
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.TriggerCallback(name, ...)
 | 
						|
    local cb = nil
 | 
						|
    local args = { ... }
 | 
						|
 | 
						|
    if QBCore.Shared.IsFunction(args[1]) then
 | 
						|
        cb = args[1]
 | 
						|
        table.remove(args, 1)
 | 
						|
    end
 | 
						|
 | 
						|
    QBCore.ServerCallbacks[name] = {
 | 
						|
        callback = cb,
 | 
						|
        promise = promise.new()
 | 
						|
    }
 | 
						|
 | 
						|
    TriggerServerEvent('QBCore:Server:TriggerCallback', name, table.unpack(args))
 | 
						|
 | 
						|
    if cb == nil then
 | 
						|
        Citizen.Await(QBCore.ServerCallbacks[name].promise)
 | 
						|
        return QBCore.ServerCallbacks[name].promise.value
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Debug(resource, obj, depth)
 | 
						|
    TriggerServerEvent('QBCore:DebugSomething', resource, obj, depth)
 | 
						|
end
 | 
						|
 | 
						|
-- Player
 | 
						|
 | 
						|
function QBCore.Functions.GetPlayerData(cb)
 | 
						|
    if not cb then return QBCore.PlayerData end
 | 
						|
    cb(QBCore.PlayerData)
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetCoords(entity)
 | 
						|
    local coords = GetEntityCoords(entity)
 | 
						|
    return vector4(coords.x, coords.y, coords.z, GetEntityHeading(entity))
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.HasItem(items, amount)
 | 
						|
    return exports['qb-inventory']:HasItem(items, amount)
 | 
						|
end
 | 
						|
 | 
						|
---Returns the full character name
 | 
						|
---@return string
 | 
						|
function QBCore.Functions.GetName()
 | 
						|
    local charinfo = QBCore.PlayerData.charinfo
 | 
						|
    return charinfo.firstname .. ' ' .. charinfo.lastname
 | 
						|
end
 | 
						|
 | 
						|
---@param entity number - The entity to look at
 | 
						|
---@param timeout number - The time in milliseconds before the function times out
 | 
						|
---@param speed number - The speed at which the entity should turn
 | 
						|
---@return number - The time at which the entity was looked at
 | 
						|
function QBCore.Functions.LookAtEntity(entity, timeout, speed)
 | 
						|
    local involved = GetInvokingResource()
 | 
						|
    if not DoesEntityExist(entity) then
 | 
						|
        return involved .. ' :^1  Entity does not exist'
 | 
						|
    end
 | 
						|
    if type(entity) ~= 'number' then
 | 
						|
        return involved .. ' :^1  Entity must be a number'
 | 
						|
    end
 | 
						|
    if type(speed) ~= 'number' then
 | 
						|
        return involved .. ' :^1  Speed must be a number'
 | 
						|
    end
 | 
						|
    if speed > 5.0 then speed = 5.0 end
 | 
						|
    if timeout > 5000 then timeout = 5000 end
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local playerPos = GetEntityCoords(ped)
 | 
						|
    local targetPos = GetEntityCoords(entity)
 | 
						|
    local dx = targetPos.x - playerPos.x
 | 
						|
    local dy = targetPos.y - playerPos.y
 | 
						|
    local targetHeading = GetHeadingFromVector_2d(dx, dy)
 | 
						|
    local turnSpeed
 | 
						|
    local startTimeout = GetGameTimer()
 | 
						|
    while true do
 | 
						|
        local currentHeading = GetEntityHeading(ped)
 | 
						|
        local diff = targetHeading - currentHeading
 | 
						|
        if math.abs(diff) < 2 then
 | 
						|
            break
 | 
						|
        end
 | 
						|
        if diff < -180 then
 | 
						|
            diff = diff + 360
 | 
						|
        elseif diff > 180 then
 | 
						|
            diff = diff - 360
 | 
						|
        end
 | 
						|
        turnSpeed = speed + (2.5 - speed) * (1 - math.abs(diff) / 180)
 | 
						|
        if diff > 0 then
 | 
						|
            currentHeading = currentHeading + turnSpeed
 | 
						|
        else
 | 
						|
            currentHeading = currentHeading - turnSpeed
 | 
						|
        end
 | 
						|
        SetEntityHeading(ped, currentHeading)
 | 
						|
        Wait(0)
 | 
						|
        if (startTimeout + timeout) < GetGameTimer() then break end
 | 
						|
    end
 | 
						|
    SetEntityHeading(ped, targetHeading)
 | 
						|
end
 | 
						|
 | 
						|
-- Function to run an animation
 | 
						|
--- @param animDic string: The name of the animation dictionary
 | 
						|
--- @param animName string - The name of the animation within the dictionary
 | 
						|
--- @param duration number - The duration of the animation in milliseconds. -1 will play the animation indefinitely
 | 
						|
--- @param upperbodyOnly boolean - If true, the animation will only affect the upper body of the ped
 | 
						|
--- @return number - The timestamp indicating when the animation concluded. For animations set to loop indefinitely, this will still return the maximum duration of the animation.
 | 
						|
function QBCore.Functions.PlayAnim(animDict, animName, upperbodyOnly, duration)
 | 
						|
    local invoked = GetInvokingResource()
 | 
						|
    local animPromise = promise.new()
 | 
						|
    if type(animDict) ~= 'string' or type(animName) ~= 'string' then
 | 
						|
        animPromise:reject(invoked .. ' :^1  Wrong type for animDict or animName')
 | 
						|
        return animPromise.value
 | 
						|
    end
 | 
						|
    if not DoesAnimDictExist(animDict) then
 | 
						|
        animPromise:reject(invoked .. ' :^1  Animation dictionary does not exist')
 | 
						|
        return animPromise.value
 | 
						|
    end
 | 
						|
    local flags = upperbodyOnly and 16 or 0
 | 
						|
    local runTime = duration or -1
 | 
						|
    if runTime == -1 then flags = 49 end
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local start = GetGameTimer()
 | 
						|
    while not HasAnimDictLoaded(animDict) do
 | 
						|
        RequestAnimDict(animDict)
 | 
						|
        if (GetGameTimer() - start) > 5000 then
 | 
						|
            animPromise:reject(invoked .. ' :^1  Animation dictionary failed to load')
 | 
						|
            return animPromise.value
 | 
						|
        end
 | 
						|
        Wait(1)
 | 
						|
    end
 | 
						|
    TaskPlayAnim(ped, animDict, animName, 8.0, 8.0, runTime, flags, 0, true, true, true)
 | 
						|
    Wait(10) -- Wait a bit for the animation to start, then check if it exists
 | 
						|
    local currentTime = GetAnimDuration(animDict, animName)
 | 
						|
    if currentTime == 0 then
 | 
						|
        animPromise:reject(invoked .. ' :^1  Animation does not exist')
 | 
						|
        return animPromise.value
 | 
						|
    end
 | 
						|
    local fullDuration = currentTime * 1000
 | 
						|
    -- If duration is provided and is less than the full duration, use it instead
 | 
						|
    local waitTime = duration and math.min(duration, fullDuration) or fullDuration
 | 
						|
    Wait(waitTime)
 | 
						|
    RemoveAnimDict(animDict)
 | 
						|
    animPromise:resolve(currentTime)
 | 
						|
    return animPromise.value
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.IsWearingGloves()
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local armIndex = GetPedDrawableVariation(ped, 3)
 | 
						|
    local model = GetEntityModel(ped)
 | 
						|
    if model == `mp_m_freemode_01` then
 | 
						|
        if QBCore.Shared.MaleNoGloves[armIndex] then
 | 
						|
            return false
 | 
						|
        end
 | 
						|
    else
 | 
						|
        if QBCore.Shared.FemaleNoGloves[armIndex] then
 | 
						|
            return false
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return true
 | 
						|
end
 | 
						|
 | 
						|
-- NUI Calls
 | 
						|
 | 
						|
function QBCore.Functions.Notify(text, texttype, length, icon)
 | 
						|
    local message = {
 | 
						|
        action = 'notify',
 | 
						|
        type = texttype or 'primary',
 | 
						|
        length = length or 5000,
 | 
						|
    }
 | 
						|
 | 
						|
    if type(text) == 'table' then
 | 
						|
        message.text = text.text or 'Placeholder'
 | 
						|
        message.caption = text.caption or 'Placeholder'
 | 
						|
    else
 | 
						|
        message.text = text
 | 
						|
    end
 | 
						|
 | 
						|
    if icon then
 | 
						|
        message.icon = icon
 | 
						|
    end
 | 
						|
 | 
						|
    SendNUIMessage(message)
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.Progressbar(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel)
 | 
						|
    if GetResourceState('progressbar') ~= 'started' then error('progressbar needs to be started in order for QBCore.Functions.Progressbar to work') end
 | 
						|
    exports['progressbar']:Progress({
 | 
						|
        name = name:lower(),
 | 
						|
        duration = duration,
 | 
						|
        label = label,
 | 
						|
        useWhileDead = useWhileDead,
 | 
						|
        canCancel = canCancel,
 | 
						|
        controlDisables = disableControls,
 | 
						|
        animation = animation,
 | 
						|
        prop = prop,
 | 
						|
        propTwo = propTwo,
 | 
						|
    }, function(cancelled)
 | 
						|
        if not cancelled then
 | 
						|
            if onFinish then
 | 
						|
                onFinish()
 | 
						|
            end
 | 
						|
        else
 | 
						|
            if onCancel then
 | 
						|
                onCancel()
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end)
 | 
						|
end
 | 
						|
 | 
						|
-- World Getters
 | 
						|
 | 
						|
function QBCore.Functions.GetVehicles()
 | 
						|
    return GetGamePool('CVehicle')
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetObjects()
 | 
						|
    return GetGamePool('CObject')
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetPlayers()
 | 
						|
    return GetActivePlayers()
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetPlayersFromCoords(coords, distance)
 | 
						|
    local players = GetActivePlayers()
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(ped)
 | 
						|
    end
 | 
						|
    distance = distance or 5
 | 
						|
    local closePlayers = {}
 | 
						|
    for _, player in ipairs(players) do
 | 
						|
        local targetCoords = GetEntityCoords(GetPlayerPed(player))
 | 
						|
        local targetdistance = #(targetCoords - coords)
 | 
						|
        if targetdistance <= distance then
 | 
						|
            closePlayers[#closePlayers + 1] = player
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return closePlayers
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetClosestPlayer(coords)
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(ped)
 | 
						|
    end
 | 
						|
    local closestPlayers = QBCore.Functions.GetPlayersFromCoords(coords)
 | 
						|
    local closestDistance = -1
 | 
						|
    local closestPlayer = -1
 | 
						|
    for i = 1, #closestPlayers, 1 do
 | 
						|
        if closestPlayers[i] ~= PlayerId() and closestPlayers[i] ~= -1 then
 | 
						|
            local pos = GetEntityCoords(GetPlayerPed(closestPlayers[i]))
 | 
						|
            local distance = #(pos - coords)
 | 
						|
 | 
						|
            if closestDistance == -1 or closestDistance > distance then
 | 
						|
                closestPlayer = closestPlayers[i]
 | 
						|
                closestDistance = distance
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return closestPlayer, closestDistance
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetPeds(ignoreList)
 | 
						|
    local pedPool = GetGamePool('CPed')
 | 
						|
    local peds = {}
 | 
						|
    local ignoreTable = {}
 | 
						|
    ignoreList = ignoreList or {}
 | 
						|
    for i = 1, #ignoreList do
 | 
						|
        ignoreTable[ignoreList[i]] = true
 | 
						|
    end
 | 
						|
    for i = 1, #pedPool do
 | 
						|
        if not ignoreTable[pedPool[i]] then
 | 
						|
            peds[#peds + 1] = pedPool[i]
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return peds
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetClosestPed(coords, ignoreList)
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(ped)
 | 
						|
    end
 | 
						|
    ignoreList = ignoreList or {}
 | 
						|
    local peds = QBCore.Functions.GetPeds(ignoreList)
 | 
						|
    local closestDistance = -1
 | 
						|
    local closestPed = -1
 | 
						|
    for i = 1, #peds, 1 do
 | 
						|
        local pedCoords = GetEntityCoords(peds[i])
 | 
						|
        local distance = #(pedCoords - coords)
 | 
						|
 | 
						|
        if closestDistance == -1 or closestDistance > distance then
 | 
						|
            closestPed = peds[i]
 | 
						|
            closestDistance = distance
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return closestPed, closestDistance
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetClosestVehicle(coords)
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local vehicles = GetGamePool('CVehicle')
 | 
						|
    local closestDistance = -1
 | 
						|
    local closestVehicle = -1
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(ped)
 | 
						|
    end
 | 
						|
    for i = 1, #vehicles, 1 do
 | 
						|
        local vehicleCoords = GetEntityCoords(vehicles[i])
 | 
						|
        local distance = #(vehicleCoords - coords)
 | 
						|
 | 
						|
        if closestDistance == -1 or closestDistance > distance then
 | 
						|
            closestVehicle = vehicles[i]
 | 
						|
            closestDistance = distance
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return closestVehicle, closestDistance
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetClosestObject(coords)
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local objects = GetGamePool('CObject')
 | 
						|
    local closestDistance = -1
 | 
						|
    local closestObject = -1
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(ped)
 | 
						|
    end
 | 
						|
    for i = 1, #objects, 1 do
 | 
						|
        local objectCoords = GetEntityCoords(objects[i])
 | 
						|
        local distance = #(objectCoords - coords)
 | 
						|
        if closestDistance == -1 or closestDistance > distance then
 | 
						|
            closestObject = objects[i]
 | 
						|
            closestDistance = distance
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return closestObject, closestDistance
 | 
						|
end
 | 
						|
 | 
						|
-- Vehicle
 | 
						|
 | 
						|
function QBCore.Functions.LoadModel(model)
 | 
						|
    if HasModelLoaded(model) then return end
 | 
						|
    RequestModel(model)
 | 
						|
    while not HasModelLoaded(model) do
 | 
						|
        Wait(0)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked, teleportInto)
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    model = type(model) == 'string' and joaat(model) or model
 | 
						|
    if not IsModelInCdimage(model) then return end
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(ped)
 | 
						|
    end
 | 
						|
    isnetworked = isnetworked == nil or isnetworked
 | 
						|
    QBCore.Functions.LoadModel(model)
 | 
						|
    local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, isnetworked, false)
 | 
						|
    local netid = NetworkGetNetworkIdFromEntity(veh)
 | 
						|
    SetVehicleHasBeenOwnedByPlayer(veh, true)
 | 
						|
    SetNetworkIdCanMigrate(netid, true)
 | 
						|
    SetVehicleNeedsToBeHotwired(veh, false)
 | 
						|
    SetVehRadioStation(veh, 'OFF')
 | 
						|
    SetVehicleFuelLevel(veh, 100.0)
 | 
						|
    SetModelAsNoLongerNeeded(model)
 | 
						|
    if teleportInto then TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1) end
 | 
						|
    if cb then cb(veh) end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.DeleteVehicle(vehicle)
 | 
						|
    SetEntityAsMissionEntity(vehicle, true, true)
 | 
						|
    DeleteVehicle(vehicle)
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetPlate(vehicle)
 | 
						|
    if vehicle == 0 then return end
 | 
						|
    return QBCore.Shared.Trim(GetVehicleNumberPlateText(vehicle))
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetVehicleLabel(vehicle)
 | 
						|
    if vehicle == nil or vehicle == 0 then return end
 | 
						|
    return GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)))
 | 
						|
end
 | 
						|
 | 
						|
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 xenonColor
 | 
						|
        local hasCustom, r, g, b = GetVehicleXenonLightsCustomColor(vehicle)
 | 
						|
        if hasCustom then
 | 
						|
            xenonColor = table.pack(r, g, b)
 | 
						|
        else
 | 
						|
            xenonColor = GetVehicleXenonLightsColor(vehicle)
 | 
						|
        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,
 | 
						|
            neonEnabled = {
 | 
						|
                IsVehicleNeonLightEnabled(vehicle, 0),
 | 
						|
                IsVehicleNeonLightEnabled(vehicle, 1),
 | 
						|
                IsVehicleNeonLightEnabled(vehicle, 2),
 | 
						|
                IsVehicleNeonLightEnabled(vehicle, 3)
 | 
						|
            },
 | 
						|
            neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)),
 | 
						|
            interiorColor = GetVehicleInteriorColour(vehicle),
 | 
						|
            extras = extras,
 | 
						|
            tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)),
 | 
						|
            xenonColor = xenonColor,
 | 
						|
            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),
 | 
						|
        }
 | 
						|
    else
 | 
						|
        return
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.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 + 0.0)
 | 
						|
        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 + 0.0)
 | 
						|
        end
 | 
						|
        if props.color1 then
 | 
						|
            if type(props.color1) == 'number' then
 | 
						|
                ClearVehicleCustomPrimaryColour(vehicle)
 | 
						|
                SetVehicleColours(vehicle, props.color1, colorSecondary)
 | 
						|
            else
 | 
						|
                SetVehicleCustomPrimaryColour(vehicle, props.color1[1], props.color1[2], props.color1[3])
 | 
						|
            end
 | 
						|
        end
 | 
						|
        if props.color2 then
 | 
						|
            if type(props.color2) == 'number' then
 | 
						|
                ClearVehicleCustomSecondaryColour(vehicle)
 | 
						|
                SetVehicleColours(vehicle, props.color1 or colorPrimary, props.color2)
 | 
						|
            else
 | 
						|
                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 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.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 props.modTurbo then
 | 
						|
            ToggleVehicleMod(vehicle, 18, props.modTurbo)
 | 
						|
        end
 | 
						|
        if props.modKit19 then
 | 
						|
            SetVehicleMod(vehicle, 19, props.modKit19, false)
 | 
						|
        end
 | 
						|
        if props.modSmokeEnabled then
 | 
						|
            ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled)
 | 
						|
        end
 | 
						|
        if props.modKit21 then
 | 
						|
            SetVehicleMod(vehicle, 21, props.modKit21, false)
 | 
						|
        end
 | 
						|
        if props.modXenon then
 | 
						|
            ToggleVehicleMod(vehicle, 22, props.modXenon)
 | 
						|
        end
 | 
						|
        if props.xenonColor then
 | 
						|
            if type(props.xenonColor) == 'table' then
 | 
						|
                SetVehicleXenonLightsCustomColor(vehicle, props.xenonColor[1], props.xenonColor[2], props.xenonColor[3])
 | 
						|
            else
 | 
						|
                SetVehicleXenonLightsColor(vehicle, props.xenonColor)
 | 
						|
            end
 | 
						|
        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
 | 
						|
 | 
						|
-- Unused
 | 
						|
 | 
						|
function QBCore.Functions.DrawText(x, y, width, height, scale, r, g, b, a, text)
 | 
						|
    -- Use local function instead
 | 
						|
    SetTextFont(4)
 | 
						|
    SetTextScale(scale, scale)
 | 
						|
    SetTextColour(r, g, b, a)
 | 
						|
    BeginTextCommandDisplayText('STRING')
 | 
						|
    AddTextComponentSubstringPlayerName(text)
 | 
						|
    EndTextCommandDisplayText(x - width / 2, y - height / 2 + 0.005)
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.DrawText3D(x, y, z, text)
 | 
						|
    -- Use local function instead
 | 
						|
    SetTextScale(0.35, 0.35)
 | 
						|
    SetTextFont(4)
 | 
						|
    SetTextProportional(1)
 | 
						|
    SetTextColour(255, 255, 255, 215)
 | 
						|
    BeginTextCommandDisplayText('STRING')
 | 
						|
    SetTextCentre(true)
 | 
						|
    AddTextComponentSubstringPlayerName(text)
 | 
						|
    SetDrawOrigin(x, y, z, 0)
 | 
						|
    EndTextCommandDisplayText(0.0, 0.0)
 | 
						|
    local factor = (string.len(text)) / 370
 | 
						|
    DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75)
 | 
						|
    ClearDrawOrigin()
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.RequestAnimDict(animDict)
 | 
						|
    if HasAnimDictLoaded(animDict) then return end
 | 
						|
    RequestAnimDict(animDict)
 | 
						|
    while not HasAnimDictLoaded(animDict) do
 | 
						|
        Wait(0)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetClosestBone(entity, list)
 | 
						|
    local playerCoords, bone, coords, distance = GetEntityCoords(PlayerPedId())
 | 
						|
    for _, element in pairs(list) do
 | 
						|
        local boneCoords = GetWorldPositionOfEntityBone(entity, element.id or element)
 | 
						|
        local boneDistance = #(playerCoords - boneCoords)
 | 
						|
        if not coords then
 | 
						|
            bone, coords, distance = element, boneCoords, boneDistance
 | 
						|
        elseif distance > boneDistance then
 | 
						|
            bone, coords, distance = element, boneCoords, boneDistance
 | 
						|
        end
 | 
						|
    end
 | 
						|
    if not bone then
 | 
						|
        bone = { id = GetEntityBoneIndexByName(entity, 'bodyshell'), type = 'remains', name = 'bodyshell' }
 | 
						|
        coords = GetWorldPositionOfEntityBone(entity, bone.id)
 | 
						|
        distance = #(coords - playerCoords)
 | 
						|
    end
 | 
						|
    return bone, coords, distance
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetBoneDistance(entity, boneType, boneIndex)
 | 
						|
    local bone
 | 
						|
    if boneType == 1 then
 | 
						|
        bone = GetPedBoneIndex(entity, boneIndex)
 | 
						|
    else
 | 
						|
        bone = GetEntityBoneIndexByName(entity, boneIndex)
 | 
						|
    end
 | 
						|
    local boneCoords = GetWorldPositionOfEntityBone(entity, bone)
 | 
						|
    local playerCoords = GetEntityCoords(PlayerPedId())
 | 
						|
    return #(boneCoords - playerCoords)
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.AttachProp(ped, model, boneId, x, y, z, xR, yR, zR, vertex)
 | 
						|
    local modelHash = type(model) == 'string' and joaat(model) or model
 | 
						|
    local bone = GetPedBoneIndex(ped, boneId)
 | 
						|
    QBCore.Functions.LoadModel(modelHash)
 | 
						|
    local prop = CreateObject(modelHash, 1.0, 1.0, 1.0, 1, 1, 0)
 | 
						|
    AttachEntityToEntity(prop, ped, bone, x, y, z, xR, yR, zR, 1, 1, 0, 1, not vertex and 2 or 0, 1)
 | 
						|
    SetModelAsNoLongerNeeded(modelHash)
 | 
						|
    return prop
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.SpawnClear(coords, radius)
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(PlayerPedId())
 | 
						|
    end
 | 
						|
    local vehicles = GetGamePool('CVehicle')
 | 
						|
    local closeVeh = {}
 | 
						|
    for i = 1, #vehicles, 1 do
 | 
						|
        local vehicleCoords = GetEntityCoords(vehicles[i])
 | 
						|
        local distance = #(vehicleCoords - coords)
 | 
						|
        if distance <= radius then
 | 
						|
            closeVeh[#closeVeh + 1] = vehicles[i]
 | 
						|
        end
 | 
						|
    end
 | 
						|
    if #closeVeh > 0 then return false end
 | 
						|
    return true
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.LoadAnimSet(animSet)
 | 
						|
    if HasAnimSetLoaded(animSet) then return end
 | 
						|
    RequestAnimSet(animSet)
 | 
						|
    while not HasAnimSetLoaded(animSet) do
 | 
						|
        Wait(0)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.LoadParticleDictionary(dictionary)
 | 
						|
    if HasNamedPtfxAssetLoaded(dictionary) then return end
 | 
						|
    RequestNamedPtfxAsset(dictionary)
 | 
						|
    while not HasNamedPtfxAssetLoaded(dictionary) do
 | 
						|
        Wait(0)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.StartParticleAtCoord(dict, ptName, looped, coords, rot, scale, alpha, color, duration)
 | 
						|
    if coords then
 | 
						|
        coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords
 | 
						|
    else
 | 
						|
        coords = GetEntityCoords(PlayerPedId())
 | 
						|
    end
 | 
						|
    QBCore.Functions.LoadParticleDictionary(dict)
 | 
						|
    UseParticleFxAssetNextCall(dict)
 | 
						|
    SetPtfxAssetNextCall(dict)
 | 
						|
    local particleHandle
 | 
						|
    if looped then
 | 
						|
        particleHandle = StartParticleFxLoopedAtCoord(ptName, coords.x, coords.y, coords.z, rot.x, rot.y, rot.z, scale or 1.0)
 | 
						|
        if color then
 | 
						|
            SetParticleFxLoopedColour(particleHandle, color.r, color.g, color.b, false)
 | 
						|
        end
 | 
						|
        SetParticleFxLoopedAlpha(particleHandle, alpha or 10.0)
 | 
						|
        if duration then
 | 
						|
            Wait(duration)
 | 
						|
            StopParticleFxLooped(particleHandle, 0)
 | 
						|
        end
 | 
						|
    else
 | 
						|
        SetParticleFxNonLoopedAlpha(alpha or 10.0)
 | 
						|
        if color then
 | 
						|
            SetParticleFxNonLoopedColour(color.r, color.g, color.b)
 | 
						|
        end
 | 
						|
        StartParticleFxNonLoopedAtCoord(ptName, coords.x, coords.y, coords.z, rot.x, rot.y, rot.z, scale or 1.0)
 | 
						|
    end
 | 
						|
    return particleHandle
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.StartParticleOnEntity(dict, ptName, looped, entity, bone, offset, rot, scale, alpha, color, evolution, duration)
 | 
						|
    QBCore.Functions.LoadParticleDictionary(dict)
 | 
						|
    UseParticleFxAssetNextCall(dict)
 | 
						|
    local particleHandle, boneID
 | 
						|
    if bone and GetEntityType(entity) == 1 then
 | 
						|
        boneID = GetPedBoneIndex(entity, bone)
 | 
						|
    elseif bone then
 | 
						|
        boneID = GetEntityBoneIndexByName(entity, bone)
 | 
						|
    end
 | 
						|
    if looped then
 | 
						|
        if bone then
 | 
						|
            particleHandle = StartParticleFxLoopedOnEntityBone(ptName, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, boneID, scale)
 | 
						|
        else
 | 
						|
            particleHandle = StartParticleFxLoopedOnEntity(ptName, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, scale)
 | 
						|
        end
 | 
						|
        if evolution then
 | 
						|
            SetParticleFxLoopedEvolution(particleHandle, evolution.name, evolution.amount, false)
 | 
						|
        end
 | 
						|
        if color then
 | 
						|
            SetParticleFxLoopedColour(particleHandle, color.r, color.g, color.b, false)
 | 
						|
        end
 | 
						|
        SetParticleFxLoopedAlpha(particleHandle, alpha)
 | 
						|
        if duration then
 | 
						|
            Wait(duration)
 | 
						|
            StopParticleFxLooped(particleHandle, 0)
 | 
						|
        end
 | 
						|
    else
 | 
						|
        SetParticleFxNonLoopedAlpha(alpha or 10.0)
 | 
						|
        if color then
 | 
						|
            SetParticleFxNonLoopedColour(color.r, color.g, color.b)
 | 
						|
        end
 | 
						|
        if bone then
 | 
						|
            StartParticleFxNonLoopedOnPedBone(ptName, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, boneID, scale)
 | 
						|
        else
 | 
						|
            StartParticleFxNonLoopedOnEntity(ptName, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, scale)
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return particleHandle
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetStreetNametAtCoords(coords)
 | 
						|
    local streetname1, streetname2 = GetStreetNameAtCoord(coords.x, coords.y, coords.z)
 | 
						|
    return { main = GetStreetNameFromHashKey(streetname1), cross = GetStreetNameFromHashKey(streetname2) }
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetZoneAtCoords(coords)
 | 
						|
    return GetLabelText(GetNameOfZone(coords))
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetCardinalDirection(entity)
 | 
						|
    entity = DoesEntityExist(entity) and entity or PlayerPedId()
 | 
						|
    if DoesEntityExist(entity) then
 | 
						|
        local heading = GetEntityHeading(entity)
 | 
						|
        if ((heading >= 0 and heading < 45) or (heading >= 315 and heading < 360)) then
 | 
						|
            return 'North'
 | 
						|
        elseif (heading >= 45 and heading < 135) then
 | 
						|
            return 'West'
 | 
						|
        elseif (heading >= 135 and heading < 225) then
 | 
						|
            return 'South'
 | 
						|
        elseif (heading >= 225 and heading < 315) then
 | 
						|
            return 'East'
 | 
						|
        end
 | 
						|
    else
 | 
						|
        return 'Cardinal Direction Error'
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetCurrentTime()
 | 
						|
    local obj = {}
 | 
						|
    obj.min = GetClockMinutes()
 | 
						|
    obj.hour = GetClockHours()
 | 
						|
    if obj.hour <= 12 then
 | 
						|
        obj.ampm = 'AM'
 | 
						|
    elseif obj.hour >= 13 then
 | 
						|
        obj.ampm = 'PM'
 | 
						|
        obj.formattedHour = obj.hour - 12
 | 
						|
    end
 | 
						|
    if obj.min <= 9 then
 | 
						|
        obj.formattedMin = '0' .. obj.min
 | 
						|
    end
 | 
						|
    return obj
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetGroundZCoord(coords)
 | 
						|
    if not coords then return end
 | 
						|
 | 
						|
    local retval, groundZ = GetGroundZFor_3dCoord(coords.x, coords.y, coords.z, 0)
 | 
						|
    if retval then
 | 
						|
        return vector3(coords.x, coords.y, groundZ)
 | 
						|
    else
 | 
						|
        return coords
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function QBCore.Functions.GetGroundHash(entity)
 | 
						|
    local coords = GetEntityCoords(entity)
 | 
						|
    local num = StartShapeTestCapsule(coords.x, coords.y, coords.z + 4, coords.x, coords.y, coords.z - 2.0, 1, 1, entity, 7)
 | 
						|
    local retval, success, endCoords, surfaceNormal, materialHash, entityHit = GetShapeTestResultEx(num)
 | 
						|
    return materialHash, entityHit, surfaceNormal, endCoords, success, retval
 | 
						|
end
 | 
						|
 | 
						|
for functionName, func in pairs(QBCore.Functions) do
 | 
						|
    if type(func) == 'function' then
 | 
						|
        exports(functionName, func)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Access a specific function directly:
 | 
						|
-- exports['qb-core']:Notify('Hello Player!')
 |