2025-06-13 01:23:53 +02:00
|
|
|
---@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)
|
2025-06-29 04:47:19 +02:00
|
|
|
SetVehicleNumberPlateText(veh, plate or 'DEALER')
|
2025-06-13 01:23:53 +02:00
|
|
|
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
|