@@ -494,6 +494,15 @@ float ms_fFOVCarMax = 100; // at high vehicle velocity
494494bool ms_bFOVPlayerFromScript = false ;
495495bool ms_bFOVVehicleFromScript = false ;
496496
497+ float ms_fovAiming = 70 .0f ;
498+ float ms_fovSniperAiming_Min = 0 .0f ; // default 15
499+ float ms_fovSniperAiming_Max = 179 .0f ; // default 70
500+ float ms_fov1stPersonAiming = 70 .0f ;
501+ float ms_fovSniperAiming = 70 .0f ;
502+ bool ms_fovAimingFromScript = false ;
503+ bool ms_fovSniperAimingFromScript = false ;
504+ bool ms_fov1stPersonAimingFromScript = false ;
505+
497506// consider moving this to the camera class - qaisjp
498507float CSettingsSA::GetFieldOfViewPlayer ()
499508{
@@ -510,6 +519,82 @@ float CSettingsSA::GetFieldOfViewVehicleMax()
510519 return ms_fFOVCarMax;
511520}
512521
522+ float CSettingsSA::GetFieldOfViewAiming ()
523+ {
524+ CCamera* camera = pGame->GetCamera ();
525+ CCam* cam = camera->GetCam (camera->GetActiveCam ());
526+ eCamMode cameraViewMode = static_cast <eCamMode>(camera->GetCam (camera->GetActiveCam ())->GetMode ());
527+
528+ return (cameraViewMode == MODE_AIMWEAPON || cameraViewMode == MODE_AIMWEAPON_FROMCAR || cameraViewMode == MODE_AIMWEAPON_ATTACHED) ? cam->GetFOV () : ms_fovAiming;
529+ }
530+
531+ float CSettingsSA::GetFieldOfViewSniperAiming ()
532+ {
533+ CCamera* camera = pGame->GetCamera ();
534+ CCam* cam = camera->GetCam (camera->GetActiveCam ());
535+ eCamMode cameraViewMode = static_cast <eCamMode>(camera->GetCam (camera->GetActiveCam ())->GetMode ());
536+
537+ return (cameraViewMode == MODE_SNIPER) ? cam->GetFOV () : ms_fovSniperAiming;
538+ }
539+
540+ float CSettingsSA::GetFieldOfView1stPersonAiming ()
541+ {
542+ return ms_fov1stPersonAiming;
543+ }
544+
545+ void CSettingsSA::ResetFieldOfViewPlayer ()
546+ {
547+ float fieldOfView;
548+ g_pCore->GetCVars ()->Get (" fov" , fieldOfView);
549+ fieldOfView = Clamp (70 .f , fieldOfView, 100 .f );
550+
551+ ms_bFOVPlayerFromScript = false ;
552+ SetFieldOfViewPlayer (fieldOfView, false );
553+ }
554+
555+ void CSettingsSA::ResetFieldOfViewVehicle ()
556+ {
557+ float fieldOfView;
558+ g_pCore->GetCVars ()->Get (" fov" , fieldOfView);
559+ fieldOfView = Clamp (70 .f , fieldOfView, 100 .f );
560+
561+ ms_bFOVVehicleFromScript = false ;
562+ SetFieldOfViewVehicle (fieldOfView, false );
563+ }
564+
565+ void CSettingsSA::ResetFieldOfViewVehicleMax ()
566+ {
567+ ms_bFOVVehicleFromScript = false ;
568+ SetFieldOfViewVehicleMax (100 , false );
569+ }
570+
571+ void CSettingsSA::ResetFieldOfViewSniperAiming ()
572+ {
573+ // Restore original bytes
574+ // Zoom in
575+ MemPut<void *>(0x51089F , (void *)0x858CE0 );
576+ MemPut<void *>(0x5108B8 , (void *)0x858CE0 );
577+ MemPut<void *>(0x5108AE , " \x8C\x42 " );
578+ MemPut<void *>(0x5108CF , " \x8C\x42 " );
579+
580+ // Zoom out
581+ MemPut<void *>(0x5109A3 , (void *)0x858B48 );
582+ MemPut<void *>(0x5109BC , (void *)0x858B48 );
583+ MemPut<void *>(0x5109B2 , " \x70\x41 " );
584+ MemPut<void *>(0x5109CF , " \x70\x41 " );
585+
586+ ms_fovSniperAimingFromScript = false ;
587+ ms_fovSniperAiming = 70 .0f ;
588+ }
589+
590+ void CSettingsSA::ResetFieldOfView1stPersonAiming ()
591+ {
592+ MemPut ((void *)0x510711 , " \xC7\x07\x00\x00\x8C\x42 " );
593+
594+ ms_fov1stPersonAimingFromScript = false ;
595+ ms_fov1stPersonAiming = 70 .0f ;
596+ }
597+
513598void CSettingsSA::UpdateFieldOfViewFromSettings ()
514599{
515600 float fFieldOfView ;
@@ -518,12 +603,19 @@ void CSettingsSA::UpdateFieldOfViewFromSettings()
518603 SetFieldOfViewPlayer (fFieldOfView , false );
519604 SetFieldOfViewVehicle (fFieldOfView , false );
520605 SetFieldOfViewVehicleMax (100 , false );
606+
607+ ResetFieldOfViewSniperAiming ();
608+ ResetFieldOfView1stPersonAiming ();
521609}
522610
523611void CSettingsSA::ResetFieldOfViewFromScript ()
524612{
525613 ms_bFOVPlayerFromScript = false ;
526614 ms_bFOVVehicleFromScript = false ;
615+ ms_fovAimingFromScript = false ;
616+ ms_fovSniperAimingFromScript = false ;
617+ ms_fov1stPersonAimingFromScript = false ;
618+
527619 UpdateFieldOfViewFromSettings ();
528620}
529621
@@ -598,6 +690,82 @@ void CSettingsSA::SetFieldOfViewVehicleMax(float fAngle, bool bFromScript, bool
598690 MemPut<float >(0x0524BC5 , ms_fFOVCarMax);
599691}
600692
693+ // ////////////////////////////////////////////
694+ // This needs to be called every frame, because CCam::Process_AimWeapon overrides the FOV every frame
695+ // ////////////////////////////////////////////
696+ bool CSettingsSA::SetFieldOfViewAiming (float angle, bool fromScript)
697+ {
698+ if (!fromScript && ms_fovAimingFromScript)
699+ return false ;
700+
701+ CCamera* camera = pGame->GetCamera ();
702+ CCam* cam = camera->GetCam (camera->GetActiveCam ());
703+ eCamMode cameraViewMode = static_cast <eCamMode>(camera->GetCam (camera->GetActiveCam ())->GetMode ());
704+
705+ if (cameraViewMode != MODE_AIMWEAPON && cameraViewMode != MODE_AIMWEAPON_FROMCAR && cameraViewMode != MODE_AIMWEAPON_ATTACHED)
706+ return false ;
707+
708+ cam->SetFOV (angle);
709+ ms_fovAimingFromScript = fromScript;
710+ ms_fovAiming = angle;
711+
712+ return true ;
713+ }
714+
715+ bool CSettingsSA::SetFieldOfViewSniperAiming (float angle, bool fromScript)
716+ {
717+ if (!fromScript && ms_fovSniperAimingFromScript)
718+ return false ;
719+
720+ CCamera* camera = pGame->GetCamera ();
721+ CCam* cam = camera->GetCam (camera->GetActiveCam ());
722+ eCamMode cameraViewMode = static_cast <eCamMode>(camera->GetCam (camera->GetActiveCam ())->GetMode ());
723+
724+ if (!ms_fovSniperAimingFromScript && fromScript)
725+ {
726+ // Patch sniper zoom-in/zoom-out limit
727+ // zoom in
728+ MemPut<void *>(0x51089F , &ms_fovSniperAiming_Max);
729+ MemPut<void *>(0x5108B8 , &ms_fovSniperAiming_Max);
730+
731+ MemPut<void *>(0x5108AE , " \x33\x43 " );
732+ MemPut<void *>(0x5108CF , " \x33\x43 " );
733+
734+ // zoom out
735+ MemPut<void *>(0x5109A3 , &ms_fovSniperAiming_Min);
736+ MemPut<void *>(0x5109BC , &ms_fovSniperAiming_Min);
737+ MemPut<void *>(0x5109B2 , " \x00\x00 " );
738+ MemPut<void *>(0x5109CF , " \x00\x00 " );
739+ }
740+
741+ if (cameraViewMode == MODE_SNIPER)
742+ cam->SetFOV (angle);
743+
744+ ms_fovSniperAimingFromScript = fromScript;
745+ ms_fovSniperAiming = angle;
746+ return true ;
747+ }
748+
749+ bool CSettingsSA::SetFieldOfView1stPersonAiming (float angle, bool fromScript)
750+ {
751+ if (!fromScript && ms_fov1stPersonAimingFromScript)
752+ return false ;
753+
754+ CCamera* camera = pGame->GetCamera ();
755+ CCam* cam = camera->GetCam (camera->GetActiveCam ());
756+ eCamMode cameraViewMode = static_cast <eCamMode>(camera->GetCam (camera->GetActiveCam ())->GetMode ());
757+
758+ if (!ms_fov1stPersonAimingFromScript && fromScript)
759+ MemSet ((void *)0x510711 , 0x90 , 6 );
760+
761+ if (cameraViewMode == MODE_SNIPER || cameraViewMode == MODE_M16_1STPERSON || cameraViewMode == MODE_HELICANNON_1STPERSON || cameraViewMode == MODE_CAMERA)
762+ cam->SetFOV (angle);
763+
764+ ms_fov1stPersonAimingFromScript = fromScript;
765+ ms_fov1stPersonAiming = angle;
766+ return true ;
767+ }
768+
601769// //////////////////////////////////////////////
602770//
603771// Vehicles LOD draw distance
0 commit comments