QBCore = exports['qb-core']:GetCoreObject() local PlayerData = {} local CurrentCops = 0 local isOpen = false local callSign = "" local tabletObj = nil local tabletDict = "amb@code_human_in_bus_passenger_idles@female@tablet@base" local tabletAnim = "base" local tabletProp = `prop_cs_tablet` local tabletBone = 60309 local tabletOffset = vector3(0.03, 0.002, -0.0) local tabletRot = vector3(10.0, 160.0, 0.0) local coolDown = false local lastVeh = nil local lastPlate = nil CreateThread(function() if GetResourceState('ps-dispatch') == 'started' then TriggerServerEvent("ps-mdt:dispatchStatus", true) end end) -- Events from qbcore RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() PlayerData = QBCore.Functions.GetPlayerData() callSign = PlayerData.metadata.callsign end) RegisterNetEvent('QBCore:Client:OnPlayerUnload', function() TriggerServerEvent("ps-mdt:server:OnPlayerUnload") PlayerData = {} end) RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo) PlayerData.job = JobInfo end) RegisterNetEvent('QBCore:Client:OnGangUpdate', function(GangInfo) PlayerData.gang = GangInfo end) RegisterNetEvent("QBCore:Client:SetDuty", function(job, state) if AllowedJob(job) then TriggerServerEvent("ps-mdt:server:ToggleDuty") TriggerServerEvent("ps-mdt:server:ClockSystem") TriggerServerEvent('QBCore:ToggleDuty') if PlayerData.job.name == "police" or PlayerData.job.type == "leo" then TriggerServerEvent("police:server:UpdateCurrentCops") end if (PlayerData.job.name == "ambulance" or PlayerData.job.type == "ems") and job then TriggerServerEvent('hospital:server:AddDoctor', 'ambulance') elseif (PlayerData.job.name == "ambulance" or PlayerData.job.type == "ems") and not job then TriggerServerEvent('hospital:server:RemoveDoctor', 'ambulance') end TriggerServerEvent("police:server:UpdateBlips") end end) RegisterNetEvent('police:SetCopCount', function(amount) CurrentCops = amount end) RegisterNetEvent('QBCore:Player:SetPlayerData', function(val) PlayerData = val end) AddEventHandler('onResourceStart', function(resourceName) if GetCurrentResourceName() ~= resourceName then return end Wait(150) PlayerData = QBCore.Functions.GetPlayerData() callSign = PlayerData.metadata.callsign end) AddEventHandler('onResourceStop', function(resourceName) if (GetCurrentResourceName() ~= resourceName) then return end ClearPedSecondaryTask(PlayerPedId()) SetEntityAsMissionEntity(tabletObj) DetachEntity(tabletObj, true, false) DeleteObject(tabletObj) end) --==================================================================================== ------------------------------------------ -- Functions -- ------------------------------------------ --====================================================================================\ RegisterKeyMapping('mdt', 'Åben MDT', 'keyboard', 'k') RegisterCommand('mdt', function() local plyPed = PlayerPedId() PlayerData = QBCore.Functions.GetPlayerData() if not PlayerData.metadata["isdead"] and not PlayerData.metadata["inlaststand"] and not PlayerData.metadata["ishandcuffed"] and not IsPauseMenuActive() then if GetJobType(PlayerData.job.name) ~= nil then TriggerServerEvent('mdt:server:openMDT') TriggerServerEvent('mdt:requestOfficerData') end else QBCore.Functions.Notify("Can't do that!", "error") end end, false) Citizen.CreateThread(function() TriggerEvent('chat:addSuggestion', '/mdt', 'Åben MDT', {}) end) local function doAnimation() if not isOpen then return end -- Animation RequestAnimDict(tabletDict) while not HasAnimDictLoaded(tabletDict) do Citizen.Wait(100) end -- Model RequestModel(tabletProp) while not HasModelLoaded(tabletProp) do Citizen.Wait(100) end local plyPed = PlayerPedId() tabletObj = CreateObject(tabletProp, 0.0, 0.0, 0.0, true, true, false) local tabletBoneIndex = GetPedBoneIndex(plyPed, tabletBone) AttachEntityToEntity(tabletObj, plyPed, tabletBoneIndex, tabletOffset.x, tabletOffset.y, tabletOffset.z, tabletRot.x, tabletRot.y, tabletRot.z, true, false, false, false, 2, true) SetModelAsNoLongerNeeded(tabletProp) CreateThread(function() while isOpen do Wait(0) if not IsEntityPlayingAnim(plyPed, tabletDict, tabletAnim, 3) then TaskPlayAnim(plyPed, tabletDict, tabletAnim, 3.0, 3.0, -1, 49, 0, 0, 0, 0) end end ClearPedSecondaryTask(plyPed) Citizen.Wait(250) DetachEntity(tabletObj, true, false) DeleteEntity(tabletObj) end) end local function CurrentDuty(duty) if duty == 1 then return "10-41" end return "10-42" end local function EnableGUI(enable) SetNuiFocus(enable, enable) SendNUIMessage({ type = "show", enable = enable, job = PlayerData.job.name, rosterLink = Config.RosterLink[PlayerData.job.name], sopLink = Config.sopLink[PlayerData.job.name] }) isOpen = enable doAnimation() end local function RefreshGUI() SetNuiFocus(false, false) SendNUIMessage({ type = "show", enable = false, job = PlayerData.job.name, rosterLink = Config.RosterLink[PlayerData.job.name], sopLink = Config.sopLink[PlayerData.job.name] }) isOpen = false end --// Non local function so above EHs can utilise function AllowedJob(job) for key, _ in pairs(Config.AllowedJobs) do if key == job then return true end end --// Return false if current job is not in allowed list return false end --==================================================================================== ------------------------------------------ -- MAIN PAGE -- ------------------------------------------ --==================================================================================== RegisterCommand("restartmdt", function(source, args, rawCommand) RefreshGUI() end, false) RegisterNUICallback("deleteBulletin", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:deleteBulletin', id, data.title) cb(true) end) RegisterNUICallback("newBulletin", function(data, cb) local title = data.title local info = data.info local time = data.time TriggerServerEvent('mdt:server:NewBulletin', title, info, time) cb(true) end) RegisterNUICallback('escape', function(data, cb) EnableGUI(false) cb(true) end) RegisterNetEvent('mdt:client:dashboardbulletin', function(sentData) SendNUIMessage({ type = "bulletin", data = sentData }) end) RegisterNetEvent('mdt:client:dashboardWarrants', function() QBCore.Functions.TriggerCallback("mdt:server:getWarrants", function(data) if data then SendNUIMessage({ type = "warrants", data = data }) end end) -- SendNUIMessage({ type = "warrants",}) end) RegisterNUICallback("getAllDashboardData", function(data, cb) TriggerEvent("mdt:client:dashboardWarrants") cb(true) end) RegisterNetEvent('mdt:client:dashboardReports', function(sentData) SendNUIMessage({ type = "reports", data = sentData }) end) RegisterNetEvent('mdt:client:dashboardCalls', function(sentData) SendNUIMessage({ type = "calls", data = sentData }) end) RegisterNetEvent('mdt:client:newBulletin', function(ignoreId, sentData, job) if ignoreId == GetPlayerServerId(PlayerId()) then return end; if AllowedJob(PlayerData.job.name) then SendNUIMessage({ type = "newBulletin", data = sentData }) end end) RegisterNetEvent('mdt:client:deleteBulletin', function(ignoreId, sentData, job) if ignoreId == GetPlayerServerId(PlayerId()) then return end; if AllowedJob(PlayerData.job.name) then SendNUIMessage({ type = "deleteBulletin", data = sentData }) end end) RegisterNetEvent('mdt:client:open', function(bulletin, activeUnits, calls, cid) EnableGUI(true) local x, y, z = table.unpack(GetEntityCoords(PlayerPedId())) local currentStreetHash, intersectStreetHash = GetStreetNameAtCoord(x, y, z) local currentStreetName = GetStreetNameFromHashKey(currentStreetHash) local intersectStreetName = GetStreetNameFromHashKey(intersectStreetHash) local zone = tostring(GetNameOfZone(x, y, z)) local area = GetLabelText(zone) local playerStreetsLocation = area if not zone then zone = "UKENDT" end; if intersectStreetName ~= nil and intersectStreetName ~= "" then playerStreetsLocation = currentStreetName .. ", " .. intersectStreetName .. ", " .. area elseif currentStreetName ~= nil and currentStreetName ~= "" then playerStreetsLocation = currentStreetName .. ", " .. area else playerStreetsLocation = area end -- local grade = PlayerData.job.grade.name SendNUIMessage({ type = "data", activeUnits = activeUnits, citizenid = cid, ondutyonly = Config.OnlyShowOnDuty, name = "Welcome, " ..PlayerData.job.grade.name..' '..PlayerData.charinfo.lastname:sub(1,1):upper()..PlayerData.charinfo.lastname:sub(2), location = playerStreetsLocation, fullname = PlayerData.charinfo.firstname..' '..PlayerData.charinfo.lastname, bulletin = bulletin }) SendNUIMessage({ type = "calls", data = calls }) TriggerEvent("mdt:client:dashboardWarrants") end) RegisterNetEvent('mdt:client:exitMDT', function() EnableGUI(false) end) --==================================================================================== ------------------------------------------ -- PROFILE PAGE -- ------------------------------------------ --==================================================================================== RegisterNUICallback("searchProfiles", function(data, cb) local p = promise.new() QBCore.Functions.TriggerCallback('mdt:server:SearchProfile', function(result) p:resolve(result) end, data.name) local data = Citizen.Await(p) cb(data) end) RegisterNetEvent('mdt:client:searchProfile', function(sentData, isLimited) SendNUIMessage({ action = "updateFingerprintData" }) end) RegisterNUICallback("saveProfile", function(data, cb) local profilepic = data.pfp local information = data.description local cid = data.id local fName = data.fName local sName = data.sName local tags = data.tags local gallery = data.gallery local licenses = data.licenses local fingerprint = data.fingerprint TriggerServerEvent("mdt:server:saveProfile", profilepic, information, cid, fName, sName, tags, gallery, licenses, fingerprint) cb(true) end) RegisterNUICallback("getProfileData", function(data, cb) local id = data.id local p = nil local getProfileDataPromise = function(data) if p then return end p = promise.new() QBCore.Functions.TriggerCallback('mdt:server:GetProfileData', function(result) p:resolve(result) end, data) return Citizen.Await(p) end local pP = nil local result = getProfileDataPromise(id) local vehicles = result.vehicles local licenses = result.licences for i=1,#vehicles do local vehicle=result.vehicles[i] local vehData = QBCore.Shared.Vehicles[vehicle['vehicle']] if vehData == nil then print("Vehicle not found for profile:", vehicle['vehicle']) -- Do not remove print, is a guide for a nil error. print("Make sure the profile you're trying to load has all cars added to the core under vehicles.lua.") -- Do not remove print, is a guide for a nil error. else result.vehicles[i]['model'] = vehData["name"] end end p = nil result['fingerprint'] = result['searchFingerprint'] return cb(result) end) RegisterNUICallback("newTag", function(data, cb) if data.id ~= "" and data.tag ~= "" then TriggerServerEvent('mdt:server:newTag', data.id, data.tag) end cb(true) end) RegisterNUICallback("removeProfileTag", function(data, cb) local cid = data.cid local tagtext = data.text TriggerServerEvent('mdt:server:removeProfileTag', cid, tagtext) cb(true) end) RegisterNUICallback("updateLicence", function(data, cb) local type = data.type local status = data.status local cid = data.cid TriggerServerEvent('mdt:server:updateLicense', cid, type, status) cb(true) end) --==================================================================================== ------------------------------------------ -- INCIDENTS PAGE -- ------------------------------------------ --==================================================================================== RegisterNUICallback("searchIncidents", function(data, cb) local incident = data.incident TriggerServerEvent('mdt:server:searchIncidents', incident) cb(true) end) RegisterNUICallback("getIncidentData", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:getIncidentData', id) cb(true) end) RegisterNUICallback("incidentSearchPerson", function(data, cb) local name = data.name TriggerServerEvent('mdt:server:incidentSearchPerson', name ) cb(true) end) -- Handle sending a fine to a player -- Uses the QB-Core bill command to send a fine to a player -- If you use a different fine system, you will need to change this RegisterNUICallback("sendFine", function(data, cb) local citizenId, fine, incidentId = data.citizenId, data.fine, data.incidentId -- Gets the player id from the citizenId local p = promise.new() QBCore.Functions.TriggerCallback('mdt:server:GetPlayerSourceId', function(result) p:resolve(result) end, citizenId) local targetSourceId = Citizen.Await(p) if fine > 0 then if Config.BillVariation then -- Uses QB-Core removeMoney Functions TriggerServerEvent("mdt:server:removeMoney", citizenId, fine, incidentId) else -- Uses QB-Core /bill command ExecuteCommand(('bill %s %s'):format(targetSourceId, fine)) TriggerServerEvent("mdt:server:giveCitationItem", citizenId, fine, incidentId) end end end) -- Handle sending the player to community service -- If you use a different community service system, you will need to change this RegisterNUICallback("sendToCommunityService", function(data, cb) local citizenId, sentence = data.citizenId, data.sentence -- Gets the player id from the citizenId local p = promise.new() QBCore.Functions.TriggerCallback('mdt:server:GetPlayerSourceId', function(result) p:resolve(result) end, citizenId) local targetSourceId = Citizen.Await(p) if sentence > 0 then TriggerServerEvent("qb-communityservice:server:StartCommunityService", targetSourceId, sentence) end end) RegisterNetEvent('mdt:client:getProfileData', function(sentData, isLimited) if not isLimited then local vehicles = sentData['vehicles'] for i=1, #vehicles do sentData['vehicles'][i]['plate'] = string.upper(sentData['vehicles'][i]['plate']) local tempModel = vehicles[i]['model'] if tempModel and tempModel ~= "Unknown" then local vehData = QBCore.Shared.Vehicles[tempModel] sentData['vehicles'][i]['model'] = vehData["brand"] .. ' ' .. vehData["name"] end end end SendNUIMessage({ type = "profileData", data = sentData, isLimited = isLimited }) end) RegisterNetEvent('mdt:client:getIncidents', function(sentData) SendNUIMessage({ type = "incidents", data = sentData }) end) RegisterNetEvent('mdt:client:getIncidentData', function(sentData, sentConvictions) SendNUIMessage({ type = "incidentData", data = sentData, convictions = sentConvictions }) end) RegisterNetEvent('mdt:client:incidentSearchPerson', function(sentData) SendNUIMessage({ type = "incidentSearchPerson", data = sentData }) end) RegisterNUICallback('SetHouseLocation', function(data, cb) local coords = {} for word in data.coord[1]:gmatch('[^,%s]+') do coords[#coords+1] = tonumber(word) end SetNewWaypoint(coords[1], coords[2]) QBCore.Functions.Notify('GPS sat!', 'success') end) --==================================================================================== ------------------------------------------ -- Dispatch Calls Page -- ------------------------------------------ --==================================================================================== RegisterNUICallback("searchCalls", function(data, cb) local searchCall = data.searchCall TriggerServerEvent('mdt:server:searchCalls', searchCall) cb(true) end) RegisterNetEvent('mdt:client:getCalls', function(calls, callid) SendNUIMessage({ type = "calls", data = calls }) end) --==================================================================================== ------------------------------------------ -- BOLO PAGE -- ------------------------------------------ --==================================================================================== RegisterNUICallback("searchBolos", function(data, cb) local searchVal = data.searchVal TriggerServerEvent('mdt:server:searchBolos', searchVal) cb(true) end) RegisterNUICallback("getAllBolos", function(data, cb) TriggerServerEvent('mdt:server:getAllBolos') cb(true) end) RegisterNUICallback("getAllIncidents", function(data, cb) TriggerServerEvent('mdt:server:getAllIncidents') cb(true) end) RegisterNUICallback("getBoloData", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:getBoloData', id) cb(true) end) RegisterNUICallback("newBolo", function(data, cb) local existing = data.existing local id = data.id local title = data.title local plate = data.plate local owner = data.owner local individual = data.individual local detail = data.detail local tags = data.tags local gallery = data.gallery local officers = data.officers local time = data.time TriggerServerEvent('mdt:server:newBolo', existing, id, title, plate, owner, individual, detail, tags, gallery, officers, time) cb(true) end) RegisterNUICallback("deleteWeapons", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:deleteWeapons', id) cb(true) end) RegisterNUICallback("deleteReports", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:deleteReports', id) cb(true) end) RegisterNUICallback("deleteIncidents", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:deleteIncidents', id) cb(true) end) RegisterNUICallback("deleteBolo", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:deleteBolo', id) cb(true) end) RegisterNUICallback("deleteICU", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:deleteICU', id) cb(true) end) RegisterNetEvent('mdt:client:getBolos', function(sentData) SendNUIMessage({ type = "bolos", data = sentData }) end) RegisterNetEvent('mdt:client:getAllIncidents', function(sentData) SendNUIMessage({ type = "incidents", data = sentData }) end) RegisterNetEvent('mdt:client:getAllBolos', function(sentData) SendNUIMessage({ type = "bolos", data = sentData }) end) RegisterNetEvent('mdt:client:getBoloData', function(sentData) SendNUIMessage({ type = "boloData", data = sentData }) end) RegisterNetEvent('mdt:client:boloComplete', function(sentData) SendNUIMessage({ type = "boloComplete", data = sentData }) end) --==================================================================================== ------------------------------------------ -- REPORTS PAGE -- ------------------------------------------ --==================================================================================== RegisterNUICallback("getAllReports", function(data, cb) TriggerServerEvent('mdt:server:getAllReports') cb(true) end) RegisterNUICallback("getReportData", function(data, cb) local id = data.id TriggerServerEvent('mdt:server:getReportData', id) cb(true) end) RegisterNUICallback("searchReports", function(data, cb) local name = data.name TriggerServerEvent('mdt:server:searchReports', name) cb(true) end) RegisterNUICallback("newReport", function(data, cb) local existing = data.existing local id = data.id local title = data.title local reporttype = data.type local details = data.details local tags = data.tags local gallery = data.gallery local officers = data.officers local civilians = data.civilians local time = data.time TriggerServerEvent('mdt:server:newReport', existing, id, title, reporttype, details, tags, gallery, officers, civilians, time) cb(true) end) RegisterNetEvent('mdt:client:getAllReports', function(sentData) SendNUIMessage({ type = "reports", data = sentData }) end) RegisterNetEvent('mdt:client:getReportData', function(sentData) SendNUIMessage({ type = "reportData", data = sentData }) end) RegisterNetEvent('mdt:client:reportComplete', function(sentData) SendNUIMessage({ type = "reportComplete", data = sentData }) end) --==================================================================================== ------------------------------------------ -- DMV PAGE -- ------------------------------------------ --==================================================================================== RegisterNUICallback("searchVehicles", function(data, cb) local p = promise.new() QBCore.Functions.TriggerCallback('mdt:server:SearchVehicles', function(result) p:resolve(result) end, data.name) local result = Citizen.Await(p) for i=1, #result do local vehicle = result[i] local mods = json.decode(result[i].mods) result[i]['plate'] = string.upper(result[i]['plate']) result[i]['color'] = Config.ColorInformation[mods['color1']] result[i]['colorName'] = Config.ColorNames[mods['color1']] local vehData = QBCore.Shared.Vehicles[vehicle['vehicle']] result[i]['model'] = vehData["brand"] .. ' ' .. vehData["name"] end cb(result) end) RegisterNUICallback("getVehicleData", function(data, cb) local plate = data.plate TriggerServerEvent('mdt:server:getVehicleData', plate) cb(true) end) RegisterNUICallback("saveVehicleInfo", function(data, cb) local dbid = data.dbid local plate = data.plate local imageurl = data.imageurl local notes = data.notes local stolen = data.stolen local code5 = data.code5 local impound = data.impound local points = data.points local JobType = GetJobType(PlayerData.job.name) if JobType == 'police' and impound.impoundChanged == true then if impound.impoundActive then local found = 0 local plate = string.upper(string.gsub(data['plate'], "^%s*(.-)%s*$", "%1")) local vehicles = GetGamePool('CVehicle') for k,v in pairs(vehicles) do local plt = string.upper(string.gsub(GetVehicleNumberPlateText(v), "^%s*(.-)%s*$", "%1")) if plt == plate then local dist = #(GetEntityCoords(PlayerPedId()) - GetEntityCoords(v)) if dist < 5.0 then found = VehToNet(v) SendNUIMessage({ type = "greenImpound" }) TriggerServerEvent('mdt:server:saveVehicleInfo', dbid, plate, imageurl, notes, stolen, code5, impound, points) end break end end if found == 0 then QBCore.Functions.Notify('Køretøj ikke fundet!', 'error') SendNUIMessage({ type = "redImpound" }) end else local ped = PlayerPedId() local playerPos = GetEntityCoords(ped) for k, v in pairs(Config.ImpoundLocations) do if (#(playerPos - vector3(v.x, v.y, v.z)) < 20.0) then impound.CurrentSelection = k TriggerServerEvent('mdt:server:saveVehicleInfo', dbid, plate, imageurl, notes, stolen, code5, impound, points) break end end end else TriggerServerEvent('mdt:server:saveVehicleInfo', dbid, plate, imageurl, notes, stolen, code5, impound, points) end cb(true) end) --==================================================================================== ------------------------------------------ -- Weapons PAGE -- ------------------------------------------ --==================================================================================== RegisterNUICallback("searchWeapons", function(data, cb) local p = promise.new() QBCore.Functions.TriggerCallback('mdt:server:SearchWeapons', function(result) p:resolve(result) end, data.name) local result = Citizen.Await(p) cb(result) end) RegisterNUICallback("saveWeaponInfo", function(data, cb) local serial = data.serial local notes = data.notes local imageurl = data.imageurl local owner = data.owner local weapClass = data.weapClass local weapModel = data.weapModel local JobType = GetJobType(PlayerData.job.name) if JobType == 'police' then TriggerServerEvent('mdt:server:saveWeaponInfo', serial, imageurl, notes, owner, weapClass, weapModel) end cb(true) end) RegisterNUICallback("getWeaponData", function(data, cb) local serial = data.serial TriggerServerEvent('mdt:server:getWeaponData', serial) cb(true) end) RegisterNetEvent('mdt:client:getWeaponData', function(sentData) if sentData and sentData[1] then local results = sentData[1] SendNUIMessage({ type = "getWeaponData", data = results }) end end) RegisterNUICallback("getAllLogs", function(data, cb) TriggerServerEvent('mdt:server:getAllLogs') cb(true) end) RegisterNUICallback("getPenalCode", function(data, cb) TriggerServerEvent('mdt:server:getPenalCode') cb(true) end) RegisterNUICallback("toggleDuty", function(data, cb) TriggerServerEvent('QBCore:ToggleDuty') TriggerServerEvent('ps-mdt:server:ClockSystem') cb(true) end) RegisterNUICallback("setCallsign", function(data, cb) TriggerServerEvent('mdt:server:setCallsign', data.cid, data.newcallsign) cb(true) end) RegisterNUICallback("setRadio", function(data, cb) TriggerServerEvent('mdt:server:setRadio', data.cid, data.newradio) cb(true) end) RegisterNUICallback("saveIncident", function(data, cb) TriggerServerEvent('mdt:server:saveIncident', data.ID, data.title, data.information, data.tags, data.officers, data.civilians, data.evidence, data.associated, data.time) cb(true) end) RegisterNUICallback("removeIncidentCriminal", function(data, cb) TriggerServerEvent('mdt:server:removeIncidentCriminal', data.cid, data.incidentId) cb(true) end) RegisterNetEvent('mdt:client:getVehicleData', function(sentData) if sentData and sentData[1] then local vehicle = sentData[1] local vehData = json.decode(vehicle['vehicle']) vehicle['color'] = Config.ColorInformation[vehicle['color1']] vehicle['colorName'] = Config.ColorNames[vehicle['color1']] local vehData = QBCore.Shared.Vehicles[vehicle.vehicle] vehicle.model = vehData["brand"] .. ' ' .. vehData["name"] vehicle['class'] = Config.ClassList[GetVehicleClassFromName(vehicle['vehicle'])] vehicle['vehicle'] = nil SendNUIMessage({ type = "getVehicleData", data = vehicle }) end end) RegisterNetEvent('mdt:client:updateVehicleDbId', function(sentData) SendNUIMessage({ type = "updateVehicleDbId", data = tonumber(sentData) }) end) RegisterNetEvent('mdt:client:updateWeaponDbId', function(sentData) SendNUIMessage({ type = "updateWeaponDbId", data = tonumber(sentData) }) end) RegisterNetEvent('mdt:client:getAllLogs', function(sentData) SendNUIMessage({ type = "getAllLogs", data = sentData }) end) RegisterNetEvent('mdt:client:getPenalCode', function(titles, penalcode) SendNUIMessage({ type = "getPenalCode", titles = titles, penalcode = penalcode }) end) RegisterNetEvent('mdt:client:setRadio', function(radio) if type(tonumber(radio)) == "number" then exports["pma-voice"]:setVoiceProperty("radioEnabled", true) exports["pma-voice"]:setRadioChannel(tonumber(radio)) QBCore.Functions.Notify("Du har sat din radiofrekvens til "..radio..".", "success") else QBCore.Functions.Notify("Ugyldig kanal, indtast et nummer", "error") end end) RegisterNetEvent('mdt:client:sig100', function(radio, type) local job = PlayerData.job.name local duty = PlayerData.job.onduty if AllowedJob(job) and duty == 1 then if type == true then exports['erp_notifications']:PersistentAlert("START", "signall100-"..radio, "inform", "Radio "..radio.." er på signal 100!") end end if not type then exports['erp_notifications']:PersistentAlert("END", "signall100-"..radio) end end) RegisterNetEvent('mdt:client:updateCallsign', function(callsign) callSign = tostring(callsign) end) RegisterNetEvent('mdt:client:updateIncidentDbId', function(sentData) SendNUIMessage({ type = "updateIncidentDbId", data = tonumber(sentData) }) end) --==================================================================================== ------------------------------------------ -- DISPATCH PAGE -- ------------------------------------------ --==================================================================================== RegisterNetEvent('dispatch:clNotify', function(sNotificationData, sNotificationId) if LocalPlayer.state.isLoggedIn then sNotificationData.playerJob = PlayerData.job.name SendNUIMessage({ type = "call", data = sNotificationData }) end end) RegisterNUICallback("setWaypoint", function(data, cb) TriggerServerEvent('mdt:server:setWaypoint', data.callid) cb(true) end) RegisterNUICallback("callDetach", function(data, cb) TriggerServerEvent('mdt:server:callDetach', data.callid) cb(true) end) RegisterNUICallback("removeCallBlip", function(data, cb) TriggerEvent('ps-dispatch:client:removeCallBlip', data.callid) cb(true) end) RegisterNUICallback("callAttach", function(data, cb) TriggerServerEvent('mdt:server:callAttach', data.callid) cb(true) end) RegisterNUICallback("attachedUnits", function(data, cb) TriggerServerEvent('mdt:server:attachedUnits', data.callid) cb(true) end) RegisterNUICallback("callDispatchDetach", function(data, cb) TriggerServerEvent('mdt:server:callDispatchDetach', data.callid, data.cid) cb(true) end) RegisterNUICallback("setDispatchWaypoint", function(data, cb) TriggerServerEvent('mdt:server:setDispatchWaypoint', data.callid, data.cid) cb(true) end) RegisterNUICallback("callDragAttach", function(data, cb) TriggerServerEvent('mdt:server:callDragAttach', data.callid, data.cid) cb(true) end) RegisterNUICallback("setWaypointU", function(data, cb) TriggerServerEvent('mdt:server:setWaypoint:unit', data.cid) cb(true) end) RegisterNUICallback("dispatchMessage", function(data, cb) TriggerServerEvent('mdt:server:sendMessage', data.message, data.time) cb(true) end) RegisterNUICallback("refreshDispatchMsgs", function(data, cb) TriggerServerEvent('mdt:server:refreshDispatchMsgs') cb(true) end) RegisterNUICallback("dispatchNotif", function(data, cb) local info = data['data'] local mentioned = false if callSign ~= "" then if string.find(string.lower(info['message']),string.lower(string.gsub(callSign,'-','%%-'))) then mentioned = true end end if mentioned then -- Send notification to phone?? TriggerEvent('erp_phone:sendNotification', {img = info['profilepic'], title = "Dispatch (Mention)", content = info['message'], time = 7500, customPic = true }) PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false) PlaySoundFrontend(-1, "Event_Start_Text", "GTAO_FM_Events_Soundset", 0) else TriggerEvent('erp_phone:sendNotification', {img = info['profilepic'], title = "Dispatch ("..info['name']..")", content = info['message'], time = 5000, customPic = true }) end cb(true) end) RegisterNUICallback("getCallResponses", function(data, cb) TriggerServerEvent('mdt:server:getCallResponses', data.callid) cb(true) end) RegisterNUICallback("sendCallResponse", function(data, cb) TriggerServerEvent('mdt:server:sendCallResponse', data.message, data.time, data.callid) cb(true) end) RegisterNUICallback("removeImpound", function(data, cb) local ped = PlayerPedId() local playerPos = GetEntityCoords(ped) for k, v in pairs(Config.ImpoundLocations) do if (#(playerPos - vector3(v.x, v.y, v.z)) < 20.0) then TriggerServerEvent('mdt:server:removeImpound', data['plate'], k) break end end cb('ok') end) RegisterNUICallback("statusImpound", function(data, cb) TriggerServerEvent('mdt:server:statusImpound', data['plate']) cb('ok') end) RegisterNUICallback('openCamera', function(data) local camId = tonumber(data.cam) TriggerEvent('police:client:ActiveCamera', camId) end) RegisterNetEvent('mdt:client:attachedUnits', function(sentData, callid) SendNUIMessage({ type = "attachedUnits", data = sentData, callid = callid }) end) RegisterNetEvent('mdt:client:setWaypoint', function(callInformation) SetNewWaypoint(callInformation['origin']['x'], callInformation['origin']['y']) end) RegisterNetEvent('mdt:client:callDetach', function(callid, sentData) local job = PlayerData.job.name if AllowedJob(job) then SendNUIMessage({ type = "callDetach", callid = callid, data = tonumber(sentData) }) end end) RegisterNetEvent('mdt:client:callAttach', function(callid, sentData) local job = PlayerData.job.name if AllowedJob(job) then SendNUIMessage({ type = "callAttach", callid = callid, data = tonumber(sentData) }) end end) RegisterNetEvent('mdt:client:setWaypoint:unit', function(sentData) SetNewWaypoint(sentData.x, sentData.y) end) RegisterNetEvent('mdt:client:dashboardMessage', function(sentData) local job = PlayerData.job.name if AllowedJob(job) then SendNUIMessage({ type = "dispatchmessage", data = sentData }) end end) RegisterNetEvent('mdt:client:dashboardMessages', function(sentData) SendNUIMessage({ type = "dispatchmessages", data = sentData }) end) RegisterNetEvent('mdt:client:getCallResponses', function(sentData, sentCallId) SendNUIMessage({ type = "getCallResponses", data = sentData, callid = sentCallId }) end) RegisterNetEvent('mdt:client:sendCallResponse', function(message, time, callid, name) SendNUIMessage({ type = "sendCallResponse", message = message, time = time, callid = callid, name = name }) end) RegisterNetEvent('mdt:client:statusImpound', function(data, plate) SendNUIMessage({ type = "statusImpound", data = data, plate = plate }) end) function GetPlayerWeaponInfos(cb) QBCore.Functions.TriggerCallback('getWeaponInfo', function(weaponInfos) cb(weaponInfos) end) end --3rd Eye Trigger Event RegisterNetEvent('ps-mdt:client:selfregister') AddEventHandler('ps-mdt:client:selfregister', function() GetPlayerWeaponInfos(function(weaponInfos) if weaponInfos and #weaponInfos > 0 then for _, weaponInfo in ipairs(weaponInfos) do TriggerServerEvent('mdt:server:registerweapon', weaponInfo.serialnumber, weaponInfo.weaponurl, weaponInfo.notes, weaponInfo.owner, weaponInfo.weapClass, weaponInfo.weaponmodel) TriggerEvent('QBCore:Notify', "Våben " .. weaponInfo.weaponmodel .. " blev tilføjet til databasen.") --print("Weapon added to database") end else -- print("No weapons found") end end) end) -- Uncomment if you want to use this instead. --[[ RegisterCommand('registerweapon', function(source) GetPlayerWeaponInfos(function(weaponInfos) if weaponInfos and #weaponInfos > 0 then for _, weaponInfo in ipairs(weaponInfos) do TriggerServerEvent('mdt:server:registerweapon', weaponInfo.serialnumber, weaponInfo.weaponurl, weaponInfo.notes, weaponInfo.owner, weaponInfo.weapClass, weaponInfo.weaponmodel) TriggerEvent('QBCore:Notify', "Weapon " .. weaponInfo.weaponmodel .. " has been added to police database.") --print("Weapon added to database") end else --print("No weapons found") end end) end, false) ]] --==================================================================================== ------------------------------------------ -- STAFF LOGS PAGE -- ------------------------------------------ --==================================================================================== RegisterNetEvent("mdt:receiveOfficerData") AddEventHandler("mdt:receiveOfficerData", function(officerData) SendNUIMessage({ action = "updateOfficerData", data = officerData }) end) --==================================================================================== ------------------------------------------ -- TRAFFIC STOP STUFF -- ------------------------------------------ --==================================================================================== local function vehicleData(vehicle) local vData = { name = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))), } return vData end function getStreetandZone(coords) local zone = GetLabelText(GetNameOfZone(coords.x, coords.y, coords.z)) local currentStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z) currentStreetName = GetStreetNameFromHashKey(currentStreetHash) playerStreetsLocation = currentStreetName .. ", " .. zone return playerStreetsLocation end if Config.UseWolfknightRadar == true then RegisterNetEvent("ps-mdt:client:trafficStop") AddEventHandler("ps-mdt:client:trafficStop", function() local plyData = QBCore.Functions.GetPlayerData() local currentPos = GetEntityCoords(PlayerPedId()) local locationInfo = getStreetandZone(currentPos) if not IsPedInAnyPoliceVehicle(PlayerPedId()) then QBCore.Functions.Notify("Er ikke i et politi-køretøj!", "error") return end local data, vData, vehicle = exports["wk_wars2x"]:GetFrontPlate(), {} if not coolDown then if data.veh ~= nil and data.veh ~= 0 then lastVeh = data.veh lastPlate = data.plate vehicle = vehicleData(data.veh) exports["ps-dispatch"]:CustomAlert({ coords = { x = currentPos.x, y = currentPos.y, z = currentPos.z }, message = "Trafikstop", dispatchCode = "10-11", description = "Trafikstop på "..vehicle.name..", "..data.plate..".", firstStreet = locationInfo, model = vehicle.name, plate = lastPlate, name = plyData.job.grade.name.. ", " ..plyData.charinfo.firstname:sub(1, 1):upper() .. plyData.charinfo.firstname:sub(2) .. " " .. plyData.charinfo.lastname:sub(1, 1):upper() .. plyData.charinfo.lastname:sub(2), radius = 0, sprite = 60, color = 3, scale = 1.0, length = 3, }) end coolDown = true SetTimeout(15000, function() coolDown = false end) else QBCore.Functions.Notify("Nedkøling på trafikstop", "error") end end) end