---@param coords vector ---@param sprite integer ---@param display integer ---@param scale number ---@param color integer ---@param label string ---@return integer createBlip = function(coords, sprite, display, scale, color, label) local blip = AddBlipForCoord(coords.x, coords.y, coords.z) SetBlipSprite(blip, sprite) SetBlipDisplay(blip, display) SetBlipAsShortRange(blip, true) SetBlipScale(blip, scale) SetBlipColour(blip, color) BeginTextCommandSetBlipName("STRING") AddTextComponentSubstringPlayerName(label) EndTextCommandSetBlipName(blip) return blip end ---@param model string loadModel = function(model) local time = 1000 if not HasModelLoaded(model) then while not HasModelLoaded(model) do if time > 0 then time = time - 1 RequestModel(model) else time = 1000 break end Wait(10) end end end ---@param coords vector ---@param radius number ---@param options table ---@param distance number ---@param name string ---@return unknown createSphereZoneTarget = function(coords, radius, options, distance, name) if Config.target == 'ox_target' then return exports.ox_target:addSphereZone({ debug = Config.debug, coords = coords, radius = radius, options = options }) elseif Config.target == 'interact' then return exports.interact:AddInteraction({ coords = vec3(coords.x, coords.y, coords.z), distance = 1.0, interactDst = 1.0, id = name, name = name, options = options }) else -- Here we use Box Zone cause qb-target Sphere Zone does not exists and the Circle Zone is the big shit ever made return exports[Config.target]:AddBoxZone(name, coords, radius, radius, { debugPoly = Config.debug, name = name, minZ = coords.z-radius, maxZ = coords.z+radius }, { options = options, distance = distance }) end end ---@param entity integer ---@param options table ---@param distance number ---@param name string ---@return unknown createEntityTarget = function(entity, options, distance, name) if Config.target == 'ox_target' then return exports.ox_target:addLocalEntity(entity, options) elseif Config.target == 'interact' then return exports.interact:AddLocalEntityInteraction({ entity = entity, name = name, id = name, distance = 1.0, interactDst = 1.0, options = options }) else return exports[Config.target]:AddTargetEntity(entity, { name = name, options = options, distance = distance }) end end managementMenu = function() if Config.framework == 'qb' then TriggerEvent('qb-bossmenu:client:OpenMenu') elseif Config.framework == 'qbx' then exports.qbx_management:OpenBossMenu('job') elseif Config.framework == 'esx' then TriggerEvent('esx_society:openBossMenu', getPlayerJob(), false, {wash = false}) end end ---@param message string ---@param type string notify = function(message, type) lib.notify({ description = message, type = type }) end hideTextUI = function() exports.mt_lib:hideTextUI() end ---@param model any ---@param coords vector ---@param plate string | nil ---@return any spawnVehicle = function(model, coords, plate) coords = vec4(coords.x, coords.y, coords.z, coords.w or GetEntityHeading(cache.ped)) model = type(model) == 'string' and joaat(model) or model if not IsModelInCdimage(model) then return end loadModel(model) local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, false) local netid = NetworkGetNetworkIdFromEntity(veh) SetVehicleHasBeenOwnedByPlayer(veh, true) SetNetworkIdCanMigrate(netid, true) SetVehicleNeedsToBeHotwired(veh, false) SetVehRadioStation(veh, 'OFF') SetVehicleFuelLevel(veh, 100.0) SetVehicleNumberPlateText(veh, plate or 'PDM') SetModelAsNoLongerNeeded(model) local plate = Config.framework == 'qbx' and qbx.getVehiclePlate(veh) or GetVehicleNumberPlateText(veh) if Config.keys == 'qs-vehiclekeys' then exports['qs-vehiclekeys']:GiveKeys(plate, GetDisplayNameFromVehicleModel(GetEntityModel(veh)), true) elseif Config.keys == 'mk_vehiclekeys' then exports[Config.keys]:AddKey(veh) elseif Config.keys == 'Renewed-Vehiclekeys' then exports['Renewed-Vehiclekeys']:addKey(plate) elseif Config.keys == 'MrNewbVehicleKeys' then exports.MrNewbVehicleKeys:GiveKeys(veh) else TriggerEvent("vehiclekeys:client:SetOwner", plate) end return veh end ---@param model string ---@param coords vector ---@param color integer ---@return integer createShowroomVehicle = function(model, coords, color) loadModel(model) Wait(100) local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, false, false) Wait(500) SetModelAsNoLongerNeeded(model) SetEntityInvincible(veh, true) SetVehicleDirtLevel(veh, 0.0) SetVehicleDoorsLocked(veh, 3) SetVehicleNumberPlateText(veh, 'PDM') SetVehicleColours(veh, color, color) SetVehicleExtraColours(veh, color, 0) return veh end getPlayerJob = function() if Config.framework == 'qb' then local PlayerData = Config.core.Functions.GetPlayerData() return PlayerData.job.name elseif Config.framework == 'qbx' then return QBX.PlayerData.job.name elseif Config.framework == 'esx' then return lib.callback.await('mt_dealerships:server:getPlayerJobESX', false) end end isPlayerJobBoss = function() if Config.framework == 'qb' then local PlayerData = Config.core.Functions.GetPlayerData() return PlayerData.job.isboss elseif Config.framework == 'qbx' then return QBX.PlayerData.job.isboss elseif Config.framework == 'esx' then return lib.callback.await('mt_dealerships:server:getPlayerJobIsBossESX', false) end end ---@param menu table openMenu = function(menu) lib.registerContext(menu) lib.showContext(menu.id) end ---@return string generatePlate = function() local plate = "" local chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" for i = 1, 8 do local randIndex = math.random(1, #chars) plate = plate..chars:sub(randIndex, randIndex) end return plate end ---@param coords vector ---@param distance number ---@return table getPlayersFromCoords = function(coords, distance) coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords or GetEntityCoords(cache.ped) local players = lib.getNearbyPlayers(coords, distance or 5, true) for i = 1, #players do players[i] = players[i].id end return players end ---@param veh integer removeVehicleKeys = function(veh) if Config.keys == 'Renewed-Vehiclekeys' then local plate = Config.framework == 'qbx' and qbx.getVehiclePlate(veh) or GetVehicleNumberPlateText(veh) exports['Renewed-Vehiclekeys']:removeKey(plate) end end ---@param modelHash string ---@param coords vector spawnObj = function(modelHash, coords) loadModel(modelHash) Wait(100) local obj = CreateObject(modelHash, coords.x, coords.y, coords.z, false, false, false) Wait(100) SetEntityHeading(obj, coords.w) PlaceObjectOnGroundProperly(obj) end