117 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local binoculars = false
 | |
| local fov_max = 70.0
 | |
| local fov_min = 5.0 -- max zoom level (smaller fov is more zoom)
 | |
| local fov = (fov_max + fov_min) * 0.5
 | |
| local speed_lr = 8.0 -- speed by which the camera pans left-right
 | |
| local speed_ud = 8.0 -- speed by which the camera pans up-down
 | |
| 
 | |
| --FUNCTIONS--
 | |
| 
 | |
| local function HideHUDThisFrame()
 | |
|     local componentsToHide = {1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 15, 18, 19}
 | |
| 
 | |
|     for i = 1, #componentsToHide do
 | |
|         local component = componentsToHide[i]
 | |
|         HideHudComponentThisFrame(component)
 | |
|     end
 | |
| 
 | |
|     HideHelpTextThisFrame()
 | |
|     HideHudAndRadarThisFrame()
 | |
| end
 | |
| 
 | |
| local function checkInputRot(cam, zoomValue)
 | |
|     local rightAxisX = GetDisabledControlNormal(0, 220)
 | |
|     local rightAxisY = GetDisabledControlNormal(0, 221)
 | |
|     local rot = GetCamRot(cam, 2)
 | |
|     if rightAxisX ~= 0.0 or rightAxisY ~= 0.0 then
 | |
|         local new_z = rot.z + rightAxisX * -1.0 * speed_ud * (zoomValue + 0.1)
 | |
|         local new_x = math.max(math.min(20.0, rot.x + rightAxisY * -1.0 * speed_lr * (zoomValue + 0.1)), -89.5)
 | |
|         SetCamRot(cam, new_x, 0.0, new_z, 2)
 | |
|         SetEntityHeading(PlayerPedId(), new_z)
 | |
|     end
 | |
| end
 | |
| 
 | |
| local function handleZoom(cam)
 | |
|     local ped = PlayerPedId()
 | |
|     local scrollUpControl = IsPedSittingInAnyVehicle(ped) and 17 or 241
 | |
|     local scrollDownControl = IsPedSittingInAnyVehicle(ped) and 16 or 242
 | |
| 
 | |
|     if IsControlJustPressed(0, scrollUpControl) then
 | |
|         fov = math.max(fov - Config.Binoculars.zoomSpeed, fov_min)
 | |
|     end
 | |
| 
 | |
|     if IsControlJustPressed(0, scrollDownControl) then
 | |
|         fov = math.min(fov + Config.Binoculars.zoomSpeed, fov_max)
 | |
|     end
 | |
| 
 | |
|     local current_fov = GetCamFov(cam)
 | |
| 
 | |
|     if math.abs(fov - current_fov) < 0.1 then
 | |
|         fov = current_fov
 | |
|     end
 | |
| 
 | |
|     SetCamFov(cam, current_fov + (fov - current_fov) * 0.05)
 | |
| end
 | |
| 
 | |
| --THREADS--
 | |
| 
 | |
| function binocularLoop()
 | |
|     CreateThread(function()
 | |
|         local ped = PlayerPedId()
 | |
| 
 | |
|         if not IsPedSittingInAnyVehicle(ped) then
 | |
|             TaskStartScenarioInPlace(ped, 'WORLD_HUMAN_BINOCULARS', 0, true)
 | |
|             PlayPedAmbientSpeechNative(ped, 'GENERIC_CURSE_MED', 'SPEECH_PARAMS_FORCE')
 | |
|         end
 | |
| 
 | |
|         Wait(2500)
 | |
| 
 | |
|         SetTimecycleModifier('default')
 | |
|         SetTimecycleModifierStrength(0.3)
 | |
|         local scaleform = RequestScaleformMovie('BINOCULARS')
 | |
|         while not HasScaleformMovieLoaded(scaleform) do
 | |
|             Wait(10)
 | |
|         end
 | |
| 
 | |
|         local cam = CreateCam('DEFAULT_SCRIPTED_FLY_CAMERA', true)
 | |
|         AttachCamToEntity(cam, ped, 0.0, 0.0, 1.0, true)
 | |
|         SetCamRot(cam, 0.0, 0.0, GetEntityHeading(ped), 2)
 | |
|         SetCamFov(cam, fov)
 | |
|         RenderScriptCams(true, false, 0, true, false)
 | |
|         PushScaleformMovieFunction(scaleform, 'SET_CAM_LOGO')
 | |
|         PushScaleformMovieFunctionParameterInt(0) -- 0 for nothing, 1 for LSPD logo
 | |
|         PopScaleformMovieFunctionVoid()
 | |
| 
 | |
|         while binoculars and IsPedUsingScenario(ped, 'WORLD_HUMAN_BINOCULARS') do
 | |
|             if IsControlJustPressed(0, Config.Binoculars.storeBinocularsKey) then
 | |
|                 binoculars = false
 | |
|                 PlaySoundFrontend(-1, 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET', false)
 | |
|                 ClearPedTasks(ped)
 | |
|             end
 | |
| 
 | |
|             local zoomValue = (1.0 / (fov_max - fov_min)) * (fov - fov_min)
 | |
|             checkInputRot(cam, zoomValue)
 | |
|             handleZoom(cam)
 | |
|             HideHUDThisFrame()
 | |
|             DrawScaleformMovieFullscreen(scaleform, 255, 255, 255, 255, 0)
 | |
|             Wait(0)
 | |
|         end
 | |
|         binoculars = false
 | |
|         ClearTimecycleModifier()
 | |
|         fov = (fov_max + fov_min) * 0.5
 | |
|         RenderScriptCams(false, false, 0, true, false)
 | |
|         SetScaleformMovieAsNoLongerNeeded(scaleform)
 | |
|         DestroyCam(cam, false)
 | |
|         SetNightvision(false)
 | |
|         SetSeethrough(false)
 | |
|     end)
 | |
| end
 | |
| 
 | |
| --EVENTS--
 | |
| 
 | |
| -- Activate binoculars
 | |
| RegisterNetEvent('binoculars:Toggle', function()
 | |
|     binoculars = not binoculars
 | |
|     if binoculars then binocularLoop() return end
 | |
|     ClearPedTasks(PlayerPedId())
 | |
| end)
 | 
