local currentCameraIndex = 0 local createdCamera = 0 local function GetCurrentTime() local hours = GetClockHours() local minutes = GetClockMinutes() if hours < 10 then hours = tostring(0 .. GetClockHours()) end if minutes < 10 then minutes = tostring(0 .. GetClockMinutes()) end return tostring(hours .. ":" .. minutes) end local function ChangeSecurityCamera(x, y, z, r) if createdCamera ~= 0 then DestroyCam(createdCamera, 0) createdCamera = 0 end local cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", 1) SetCamCoord(cam, x, y, z) SetCamRot(cam, r.x, r.y, r.z, 2) RenderScriptCams(1, 0, 0, 1, 1) Wait(250) createdCamera = cam end local function CloseSecurityCamera() DestroyCam(createdCamera, 0) RenderScriptCams(0, 0, 1, 1, 1) createdCamera = 0 ClearTimecycleModifier("scanline_cam_cheap") SetFocusEntity(GetPlayerPed(PlayerId())) if Config.SecurityCameras.hideradar then DisplayRadar(true) end FreezeEntityPosition(GetPlayerPed(PlayerId()), false) end local function InstructionButton(ControlButton) ScaleformMovieMethodAddParamPlayerNameString(ControlButton) end local function InstructionButtonMessage(text) BeginTextCommandScaleformString("STRING") AddTextComponentScaleform(text) EndTextCommandScaleformString() end local function CreateInstuctionScaleform(scaleform) scaleform = RequestScaleformMovie(scaleform) while not HasScaleformMovieLoaded(scaleform) do Wait(0) end PushScaleformMovieFunction(scaleform, "CLEAR_ALL") PopScaleformMovieFunctionVoid() PushScaleformMovieFunction(scaleform, "SET_CLEAR_SPACE") PushScaleformMovieFunctionParameterInt(200) PopScaleformMovieFunctionVoid() PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT") PushScaleformMovieFunctionParameterInt(1) InstructionButton(GetControlInstructionalButton(1, 194, true)) InstructionButtonMessage(Lang:t('info.close_camera')) PopScaleformMovieFunctionVoid() PushScaleformMovieFunction(scaleform, "DRAW_INSTRUCTIONAL_BUTTONS") PopScaleformMovieFunctionVoid() PushScaleformMovieFunction(scaleform, "SET_BACKGROUND_COLOUR") PushScaleformMovieFunctionParameterInt(0) PushScaleformMovieFunctionParameterInt(0) PushScaleformMovieFunctionParameterInt(0) PushScaleformMovieFunctionParameterInt(80) PopScaleformMovieFunctionVoid() return scaleform end -- Events RegisterNetEvent('police:client:ActiveCamera', function(cameraId) if Config.SecurityCameras.cameras[cameraId] then DoScreenFadeOut(250) while not IsScreenFadedOut() do Wait(0) end SendNUIMessage({ type = "enablecam", label = Config.SecurityCameras.cameras[cameraId].label, id = cameraId, connected = Config.SecurityCameras.cameras[cameraId].isOnline, time = GetCurrentTime(), }) local firstCamx = Config.SecurityCameras.cameras[cameraId].coords.x local firstCamy = Config.SecurityCameras.cameras[cameraId].coords.y local firstCamz = Config.SecurityCameras.cameras[cameraId].coords.z local firstCamr = Config.SecurityCameras.cameras[cameraId].r SetFocusArea(firstCamx, firstCamy, firstCamz, firstCamx, firstCamy, firstCamz) ChangeSecurityCamera(firstCamx, firstCamy, firstCamz, firstCamr) currentCameraIndex = cameraId DoScreenFadeIn(250) elseif cameraId == 0 then DoScreenFadeOut(250) while not IsScreenFadedOut() do Wait(0) end CloseSecurityCamera() SendNUIMessage({ type = "disablecam", }) DoScreenFadeIn(250) else QBCore.Functions.Notify(Lang:t("error.no_camera"), "error") end end) RegisterNetEvent('police:client:DisableAllCameras', function() for k, _ in pairs(Config.SecurityCameras.cameras) do Config.SecurityCameras.cameras[k].isOnline = false end end) RegisterNetEvent('police:client:EnableAllCameras', function() for k, _ in pairs(Config.SecurityCameras.cameras) do Config.SecurityCameras.cameras[k].isOnline = true end end) RegisterNetEvent('police:client:SetCamera', function(key, isOnline) if type(key) == 'table' and table.type(key) == 'array' then for _, v in pairs(key) do Config.SecurityCameras.cameras[v].isOnline = isOnline end elseif type(key) == 'number' then Config.SecurityCameras.cameras[key].isOnline = isOnline else error('police:client:SetCamera did not receive the right type of key\nreceived type: ' .. type(key) .. '\nreceived value: ' .. key) end end) -- Threads CreateThread(function() while true do local sleep = 2000 if createdCamera ~= 0 then sleep = 5 local instructions = CreateInstuctionScaleform("instructional_buttons") DrawScaleformMovieFullscreen(instructions, 255, 255, 255, 255, 0) SetTimecycleModifier("scanline_cam_cheap") SetTimecycleModifierStrength(1.0) if Config.SecurityCameras.hideradar then DisplayRadar(false) end -- CLOSE CAMERAS if IsControlJustPressed(1, 177) then DoScreenFadeOut(250) while not IsScreenFadedOut() do Wait(0) end CloseSecurityCamera() SendNUIMessage({ type = "disablecam", }) DoScreenFadeIn(250) end --------------------------------------------------------------------------- -- CAMERA ROTATION CONTROLS --------------------------------------------------------------------------- if Config.SecurityCameras.cameras[currentCameraIndex].canRotate then local getCameraRot = GetCamRot(createdCamera, 2) -- ROTATE UP if IsControlPressed(0, 32) then if getCameraRot.x <= 0.0 then SetCamRot(createdCamera, getCameraRot.x + 0.7, 0.0, getCameraRot.z, 2) end end -- ROTATE DOWN if IsControlPressed(0, 8) then if getCameraRot.x >= -50.0 then SetCamRot(createdCamera, getCameraRot.x - 0.7, 0.0, getCameraRot.z, 2) end end -- ROTATE LEFT if IsControlPressed(0, 34) then SetCamRot(createdCamera, getCameraRot.x, 0.0, getCameraRot.z + 0.7, 2) end -- ROTATE RIGHT if IsControlPressed(0, 9) then SetCamRot(createdCamera, getCameraRot.x, 0.0, getCameraRot.z - 0.7, 2) end end end Wait(sleep) end end)