206 lines
6.8 KiB
Lua
206 lines
6.8 KiB
Lua
|
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)
|