-- Initialize config(s) local shared = require 'config.shared' -- Display a notification --- @param message string --- @param type string function ShowNotification(message, type) if shared.setup.notify == 'lation_ui' then exports.lation_ui:notify({ title = 'Convenience Store', message = message, type = type, icon = 'fas fa-store' }) elseif shared.setup.notify == 'ox_lib' then lib.notify({ description = message, type = type, icon = 'fas fa-store' }) elseif shared.setup.notify == 'esx' then ESX.ShowNotification(message) elseif shared.setup.notify == 'qb' then QBCore.Functions.Notify(message, type) elseif shared.setup.notify == 'okok' then exports['okokNotify']:Alert('Convenience Store', message, 5000, type, false) elseif shared.setup.notify == 'sd-notify' then exports['sd-notify']:Notify('Convenience Store', message, type) elseif shared.setup.notify == 'wasabi_notify' then exports.wasabi_notify:notify('Convenience Store', message, 5000, type, false, 'fas fa-store') elseif shared.setup.notify == 'custom' then -- Add custom notification export/event here end end -- Display a notification from server --- @param message string --- @param type string RegisterNetEvent('lation_247robbery:Notify', function(message, type) ShowNotification(message, type) end) -- Display a minigame --- @param data table function Minigame(data) if shared.setup.minigame == 'lation_ui' then if exports.lation_ui:skillCheck(nil, data.difficulty, data.inputs) then return true end return false elseif shared.setup.minigame == 'ox_lib' then if lib.skillCheck(data.difficulty, data.inputs) then return true end return false elseif shared.setup.minigame == 'custom' then -- Add your custom minigame here end return false end -- Display a progress bar --- @param data table function ProgressBar(data) if shared.setup.progress == 'lation_ui' then if exports.lation_ui:progressBar({ label = data.label, description = data.description or nil, icon = data.icon or nil, duration = data.duration, useWhileDead = data.useWhileDead, canCancel = data.canCancel, disable = data.disable, anim = { dict = data.anim.dict or nil, clip = data.anim.clip or nil, flag = data.anim.flag or nil }, prop = { model = data.prop.model or nil, bone = data.prop.bone or nil, pos = data.prop.pos or nil, rot = data.prop.rot or nil } }) then return true end return false elseif shared.setup.progress == 'ox_lib' then -- Want to use ox_lib's progress circle instead of bar? -- Change "progressBar" to "progressCircle" below & done! if lib.progressBar({ label = data.label, duration = data.duration, position = data.position or 'bottom', useWhileDead = data.useWhileDead, canCancel = data.canCancel, disable = data.disable, anim = { dict = data.anim.dict or nil, clip = data.anim.clip or nil, flag = data.anim.flag or nil }, prop = { model = data.prop.model or nil, bone = data.prop.bone or nil, pos = data.prop.pos or nil, rot = data.prop.rot or nil } }) then return true end return false elseif shared.setup.progress == 'qbcore' then local p = promise.new() QBCore.Functions.Progressbar(data.label, data.label, data.duration, data.useWhileDead, data.canCancel, { disableMovement = data.disable.move, disableCarMovement = data.disable.car, disableMouse = false, disableCombat = data.disable.combat }, { animDict = data.anim.dict or nil, anim = data.anim.clip or nil, flags = data.anim.flag or nil }, { model = data.prop.model or nil, bone = data.prop.bone or nil, coords = data.prop.pos or nil, rotation = data.prop.rot or nil }, {}, function() p:resolve(true) end, function() p:resolve(false) end) return Citizen.Await(p) else -- Add 'custom' progress bar here end end -- Display an alert dialog --- @param data table function ShowAlert(data) if shared.setup.dialogs == 'lation_ui' then return exports.lation_ui:alert(data) elseif shared.setup.dialogs == 'ox_lib' then return lib.alertDialog(data) elseif shared.setup.dialogs == 'custom' then -- Add your custom alert dialog here end end function ShowInput(data) if shared.setup.dialogs == 'lation_ui' then return exports.lation_ui:input({ title = data.title, subtitle = data.subtitle, submitText = data.submitText, cancelText = data.cancelText, type = data.type, options = data.options }) elseif shared.setup.dialogs == 'ox_lib' then return lib.inputDialog(data.title, data.options) elseif shared.setup.dialogs == 'custom' then -- Add your custom input dialog here end end -- Send police dispatch message --- @param data table data.coords, data.street function PoliceDispatch(data) if not data then print('^1[ERROR]: Failed to retrieve dispatch data, cannot proceed^0') return end if shared.police.dispatch == 'cd_dispatch' then local playerData = exports['cd_dispatch']:GetPlayerInfo() if not playerData then print('^1[ERROR]: cd_dispatch failed to return playerData, cannot proceed^0') return end TriggerServerEvent('cd_dispatch:AddNotification', { job_table = shared.police.jobs, coords = playerData.coords, title = '10-88 - Store Robbery', message = 'An alarm has been triggered at 24/7 on ' ..playerData.street, flash = 0, unique_id = playerData.unique_id, sound = 1, blip = { sprite = 52, scale = 1.0, colour = 1, flashes = false, text = '10-88 - Store Robbery', time = 5, radius = 0, } }) elseif shared.police.dispatch == 'ps-dispatch' then local alert = { coords = data.coords, message = 'An alarm has been triggered at 24/7 on ' ..data.street, dispatchCode = '10-88', description = 'Store Robbery', radius = 0, sprite = 52, color = 1, scale = 1.0, length = 3 } exports["ps-dispatch"]:CustomAlert(alert) elseif shared.police.dispatch == 'qs-dispatch' then local playerData = exports['qs-dispatch']:GetPlayerInfo() if not playerData then print('^1[ERROR]: qs-dispatch failed to return playerData, cannot proceed^0') return end exports['qs-dispatch']:getSSURL(function(image) TriggerServerEvent('qs-dispatch:server:CreateDispatchCall', { job = shared.police.jobs, callLocation = playerData.coords, callCode = { code = '10-88', snippet = 'Store Robbery' }, message = 'An alarm has been triggered at 24/7 on ' ..playerData.street_1, flashes = false, image = image or nil, blip = { sprite = 52, scale = 1.0, colour = 1, flashes = false, text = '10-88 - Store Robbery', time = (30 * 1000), } }) end) elseif shared.police.dispatch == 'core_dispatch' then local gender = IsPedMale(cache.ped) and 'male' or 'female' TriggerServerEvent('core_dispatch:addCall', '10-88', 'Potential Store Robbery', {{icon = 'fa-venus-mars', info = gender}}, {data.coords.x, data.coords.y, data.coords.z}, 'police', 30000, 52, 1, false) elseif shared.police.dispatch == 'rcore_dispatch' then local playerData = exports['rcore_dispatch']:GetPlayerData() if not playerData then print('^1[ERROR]: rcore_dispatch failed to return playerData, cannot proceed^0') return end local alert = { code = '10-88 - Store Robbery', default_priority = 'low', coords = playerData.coords, job = shared.police.jobs, text = 'An alarm has been triggered at 24/7 on ' ..playerData.street_1, type = 'alerts', blip_time = 30, blip = { sprite = 52, colour = 1, scale = 1.0, text = '10-88 - Store Robbery', flashes = false, radius = 0, } } TriggerServerEvent('rcore_dispatch:server:sendAlert', alert) elseif shared.police.dispatch == 'aty_dispatch' then TriggerEvent('aty_dispatch:SendDispatch', 'Potential Store Robbery', '10-88', 52, shared.police.jobs) elseif shared.police.dispatch == 'op-dispatch' then local job = 'police' local text = 'An alarm has been triggered at 24/7 on ' ..data.street local coords = data.coords local id = cache.serverId local title = '10-88 - Store Robbery' local panic = false TriggerServerEvent('Opto_dispatch:Server:SendAlert', job, title, text, coords, panic, id) elseif shared.police.dispatch == 'origen_police' then local alert = { coords = data.coords, title = '10-88 - Store Robbery', type = 'GENERAL', message = 'An alarm has been triggered at 24/7 on ' ..data.street, job = 'police', } TriggerServerEvent("SendAlert:police", alert) elseif shared.police.dispatch == 'emergencydispatch' then TriggerServerEvent('emergencydispatch:emergencycall:new', 'police', '10-88 | Potential Store Robbery', data.coords, true) elseif shared.police.dispatch == 'custom' then -- Add your custom dispatch system here else print('^1[ERROR]: No dispatch system was detected - please visit config/shared.lua "police" section^0') end end -- Add circle target zones --- @param data table function AddCircleZone(data) if shared.setup.interact == 'ox_target' then exports.ox_target:addSphereZone(data) elseif shared.setup.interact == 'qb-target' then exports['qb-target']:AddCircleZone(data.name, data.coords, data.radius, { name = data.name, debugPoly = shared.setup.debug}, { options = data.options, distance = 2, }) elseif shared.setup.interact == 'interact' then exports.interact:AddInteraction({ coords = data.coords, interactDst = 2.0, id = data.name, options = data.options }) elseif shared.setup.interact == 'custom' then -- Add support for a custom target system here else print('^1[ERROR]: No interaction system was detected - please visit config/shared "setup" section^0') end end