275 lines
13 KiB
Lua
275 lines
13 KiB
Lua
--[[
|
|
ESX Property - Properties Made Right!
|
|
Copyright (C) 2025 ESX-Framework
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
]]
|
|
function CCTV(PropertyID)
|
|
DoScreenFadeOut(500)
|
|
Wait(500)
|
|
local Property = Properties[PropertyID]
|
|
local CamTakePic = true
|
|
if Property.cctv.enabled then
|
|
ESX.TriggerServerCallback("esx_property:CCTV", function(CanCCTV)
|
|
if CanCCTV then
|
|
InCCTV = true
|
|
local NightVision = false
|
|
local function InstructionButtonMessage(text)
|
|
BeginTextCommandScaleformString("STRING")
|
|
AddTextComponentScaleform(text)
|
|
EndTextCommandScaleformString()
|
|
end
|
|
|
|
local function CreateInstuctionScaleform(scaleform)
|
|
local scaleform = RequestScaleformMovie(scaleform)
|
|
while not HasScaleformMovieLoaded(scaleform) do
|
|
Wait(0)
|
|
end
|
|
PushScaleformMovieFunction(scaleform, "CLEAR_ALL")
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
PushScaleformMovieFunction(scaleform, "SET_CLEAR_SPACE")
|
|
PushScaleformMovieFunctionParameterInt(200)
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
if Config.CCTV.PictureWebook ~= "" then
|
|
PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT")
|
|
PushScaleformMovieFunctionParameterInt(1)
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.Screenshot, true))
|
|
InstructionButtonMessage(TranslateCap("take_picture"))
|
|
PopScaleformMovieFunctionVoid()
|
|
end
|
|
|
|
PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT")
|
|
PushScaleformMovieFunctionParameterInt(2)
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.Right, true))
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.Left, true))
|
|
InstructionButtonMessage(TranslateCap("rot_left_right"))
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT")
|
|
PushScaleformMovieFunctionParameterInt(3)
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.Down, true))
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.Up, true))
|
|
InstructionButtonMessage(TranslateCap("rot_up_down"))
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT")
|
|
PushScaleformMovieFunctionParameterInt(4)
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.ZoomOut, true))
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.ZoomIn, true))
|
|
InstructionButtonMessage(TranslateCap("zoom"))
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT")
|
|
PushScaleformMovieFunctionParameterInt(5)
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.NightVision, true))
|
|
InstructionButtonMessage(TranslateCap("night_vision"))
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT")
|
|
PushScaleformMovieFunctionParameterInt(0)
|
|
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(1, Config.CCTV.Controls.Exit, true))
|
|
InstructionButtonMessage(TranslateCap("exit"))
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
PushScaleformMovieFunction(scaleform, "DRAW_INSTRUCTIONAL_BUTTONS")
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
PushScaleformMovieFunction(scaleform, "SET_BACKGROUND_COLOUR")
|
|
PushScaleformMovieFunctionParameterInt(0)
|
|
PushScaleformMovieFunctionParameterInt(0)
|
|
PushScaleformMovieFunctionParameterInt(0)
|
|
PushScaleformMovieFunctionParameterInt(80)
|
|
PopScaleformMovieFunctionVoid()
|
|
|
|
return scaleform
|
|
end
|
|
ESX.CloseContext()
|
|
local cctvcam = nil
|
|
ClearFocus()
|
|
local playerPed = PlayerPedId()
|
|
cctvcam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",
|
|
vector3(Property.Entrance.x, Property.Entrance.y, Property.Entrance.z + Config.CCTV.HeightAboveDoor), 0, 0, 0, Config.CCTV.FOV)
|
|
SetCamRot(cctvcam, Property.cctv.rot.x, Property.cctv.rot.y, Property.cctv.rot.z, 2)
|
|
SetCamActive(cctvcam, true)
|
|
SetTimecycleModifier("scanline_cam_cheap")
|
|
TriggerServerEvent("p_instance:s:leave")
|
|
DisableAllControlActions(0)
|
|
FreezeEntityPosition(playerPed, true)
|
|
SetEntityCollision(playerPed, false, true)
|
|
local ShowButtons = true
|
|
SetEntityVisible(playerPed, false)
|
|
SetTimecycleModifierStrength(2.0)
|
|
SetFocusArea(Property.Entrance.x, Property.Entrance.y, Property.Entrance.z, 0.0, 0.0, 0.0)
|
|
PointCamAtCoord(cctvcam, vector3(Property.Entrance.x, Property.Entrance.y, Property.Entrance.z + Config.CCTV.HeightAboveDoor))
|
|
RenderScriptCams(true, false, 1, true, false)
|
|
Wait(1000)
|
|
DoScreenFadeIn(500)
|
|
RequestAmbientAudioBank("Phone_Soundset_Franklin", 0, 0)
|
|
RequestAmbientAudioBank("HintCamSounds", 0, 0)
|
|
while IsCamActive(cctvcam) do
|
|
Wait(5)
|
|
DisableAllControlActions(0)
|
|
EnableControlAction(0, 245, true)
|
|
EnableControlAction(0, 246, true)
|
|
EnableControlAction(0, 249, true)
|
|
HideHudComponentThisFrame(7)
|
|
HideHudComponentThisFrame(8)
|
|
HideHudComponentThisFrame(9)
|
|
HideHudComponentThisFrame(6)
|
|
HideHudComponentThisFrame(19)
|
|
HideHudAndRadarThisFrame()
|
|
|
|
if ShowButtons then
|
|
local instructions = CreateInstuctionScaleform("instructional_buttons")
|
|
DrawScaleformMovieFullscreen(instructions, 255, 255, 255, 255, 0)
|
|
end
|
|
-- ROTATE LEFT
|
|
local getCameraRot = GetCamRot(cctvcam, 2)
|
|
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.Left) and getCameraRot.z < Property.cctv.maxleft then
|
|
PlaySoundFrontend(-1, " FocusIn", "HintCamSounds", false)
|
|
SetCamRot(cctvcam, getCameraRot.x, 0.0, getCameraRot.z + Config.CCTV.RotateSpeed, 2)
|
|
end
|
|
-- ROTATE RIGHT
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.Right) and getCameraRot.z > Property.cctv.maxright then
|
|
PlaySoundFrontend(-1, " FocusIn", "HintCamSounds", false)
|
|
SetCamRot(cctvcam, getCameraRot.x, 0.0, getCameraRot.z - Config.CCTV.RotateSpeed, 2)
|
|
end
|
|
|
|
-- ROTATE UP
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.Up) and getCameraRot.x < Config.CCTV.MaxUpRotation then
|
|
PlaySoundFrontend(-1, " FocusIn", "HintCamSounds", false)
|
|
SetCamRot(cctvcam, getCameraRot.x + Config.CCTV.RotateSpeed, 0.0, getCameraRot.z, 2)
|
|
end
|
|
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.Down) and getCameraRot.x > Config.CCTV.MaxDownRotation then
|
|
PlaySoundFrontend(-1, " FocusIn", "HintCamSounds", false)
|
|
SetCamRot(cctvcam, getCameraRot.x - Config.CCTV.RotateSpeed, 0.0, getCameraRot.z, 2)
|
|
end
|
|
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.ZoomIn) and GetCamFov(cctvcam) > Config.CCTV.MaxZoom then
|
|
SetCamFov(cctvcam, GetCamFov(cctvcam) - 1.0)
|
|
end
|
|
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.ZoomOut) and GetCamFov(cctvcam) < Config.CCTV.MinZoom then
|
|
SetCamFov(cctvcam, GetCamFov(cctvcam) + 1.0)
|
|
end
|
|
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.Down) and getCameraRot.x > Config.CCTV.MaxDownRotation then
|
|
PlaySoundFrontend(-1, " FocusIn", "HintCamSounds", false)
|
|
SetCamRot(cctvcam, getCameraRot.x - Config.CCTV.RotateSpeed, 0.0, getCameraRot.z, 2)
|
|
end
|
|
|
|
SetTextFont(4)
|
|
SetTextScale(0.8, 0.8)
|
|
SetTextColour(255, 255, 255, 255)
|
|
SetTextDropshadow(0.1, 3, 27, 27, 255)
|
|
BeginTextCommandDisplayText('STRING')
|
|
AddTextComponentSubstringPlayerName(Property.setName ~= "" and Property.setName or Property.Name)
|
|
EndTextCommandDisplayText(0.01, 0.01)
|
|
|
|
SetTextFont(4)
|
|
SetTextScale(0.7, 0.7)
|
|
SetTextColour(255, 255, 255, 255)
|
|
SetTextDropshadow(0.1, 3, 27, 27, 255)
|
|
BeginTextCommandDisplayText('STRING')
|
|
local year --[[ integer ]] , month --[[ integer ]] , day --[[ integer ]] , hour --[[ integer ]] , minute --[[ integer ]] , second --[[ integer ]] =
|
|
GetPosixTime()
|
|
AddTextComponentSubstringPlayerName("" .. day .. "/" .. month .. "/" .. year .. " " .. hour .. ":" .. minute .. ":" .. second)
|
|
EndTextCommandDisplayText(0.01, 0.055)
|
|
|
|
SetTextFont(4)
|
|
SetTextScale(0.6, 0.6)
|
|
SetTextColour(255, 255, 255, 255)
|
|
SetTextDropshadow(0.1, 3, 27, 27, 255)
|
|
BeginTextCommandDisplayText('STRING')
|
|
local Zoom = ((Config.CCTV.FOV - GetCamFov(cctvcam)) / GetCamFov(cctvcam)) * 100
|
|
AddTextComponentSubstringPlayerName(TranslateCap("zoom_level", math.floor(Zoom)))
|
|
EndTextCommandDisplayText(0.01, 0.09)
|
|
|
|
SetTextFont(4)
|
|
SetTextScale(0.6, 0.6)
|
|
SetTextColour(255, 255, 255, 255)
|
|
SetTextDropshadow(0.1, 3, 27, 27, 255)
|
|
BeginTextCommandDisplayText('STRING')
|
|
AddTextComponentSubstringPlayerName(NightVision and "Night Vision: Active" or "CCTV System: Active")
|
|
EndTextCommandDisplayText(0.01, 0.12)
|
|
|
|
if IsDisabledControlPressed(0, Config.CCTV.Controls.Down) and getCameraRot.x > Config.CCTV.MaxDownRotation then
|
|
PlaySoundFrontend(-1, " FocusIn", "HintCamSounds", false)
|
|
SetCamRot(cctvcam, getCameraRot.x - Config.CCTV.RotateSpeed, 0.0, getCameraRot.z, 2)
|
|
end
|
|
|
|
if IsDisabledControlJustPressed(0, 38) then
|
|
NightVision = not NightVision
|
|
SetNightvision(NightVision)
|
|
SetTimecycleModifier("scanline_cam")
|
|
end
|
|
|
|
if Config.CCTV.PictureWebook ~= "" and IsDisabledControlJustPressed(0, 201) then
|
|
if CamTakePic then
|
|
ShowButtons = false
|
|
Wait(1)
|
|
PlaySoundFrontend(-1, "Camera_Shoot", "Phone_Soundset_Franklin", 1)
|
|
ESX.TriggerServerCallback("esx_property:GetWebhook", function(hook)
|
|
if hook then
|
|
exports['screenshot-basic']:requestScreenshotUpload(hook, "files[]", function(data)
|
|
local image = json.decode(data)
|
|
ESX.ShowNotification(TranslateCap("picture_taken"), "success")
|
|
SendNUIMessage({link = image.attachments[1].proxy_url})
|
|
ESX.ShowNotification(TranslateCap("clipboard"), "success")
|
|
ShowButtons = true
|
|
CamTakePic = false
|
|
SetTimeout(5000, function()
|
|
CamTakePic = true
|
|
end)
|
|
end)
|
|
end
|
|
end)
|
|
else
|
|
ESX.ShowNotification(TranslateCap("please_wait"), "error")
|
|
end
|
|
end
|
|
|
|
if IsDisabledControlPressed(1, Config.CCTV.Controls.Exit) then
|
|
DoScreenFadeOut(1000)
|
|
ESX.TriggerServerCallback("esx_property:ExitCCTV", function(CanExit)
|
|
if CanExit then
|
|
InCCTV = false
|
|
Wait(1000)
|
|
ClearFocus()
|
|
ClearTimecycleModifier()
|
|
ClearExtraTimecycleModifier()
|
|
RenderScriptCams(false, false, 0, true, false)
|
|
DestroyCam(cctvcam, false)
|
|
SetFocusEntity(playerPed)
|
|
SetNightvision(false)
|
|
SetSeethrough(false)
|
|
SetEntityCollision(playerPed, true, true)
|
|
FreezeEntityPosition(playerPed, false)
|
|
SetEntityVisible(playerPed, true)
|
|
Wait(1500)
|
|
DoScreenFadeIn(1000)
|
|
end
|
|
end, PropertyID)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end, PropertyID)
|
|
end
|
|
end
|