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["tgiann-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!')