Skip to content

Commit 21423b4

Browse files
committed
Add instant parameter for setCameraFieldOfView (Fixes #4274)
1 parent 7eb9fb9 commit 21423b4

File tree

4 files changed

+61
-14
lines changed

4 files changed

+61
-14
lines changed

Client/game_sa/CSettingsSA.cpp

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "CGameSA.h"
1717
#include "CHudSA.h"
1818
#include "CSettingsSA.h"
19+
#include "CCameraSA.h"
20+
#include "CCamSA.h"
1921

2022
extern CCoreInterface* g_pCore;
2123
extern CGameSA* pGame;
@@ -525,36 +527,73 @@ void CSettingsSA::ResetFieldOfViewFromScript()
525527
UpdateFieldOfViewFromSettings();
526528
}
527529

528-
void CSettingsSA::SetFieldOfViewPlayer(float fAngle, bool bFromScript)
530+
static std::pair<CCam*, unsigned int> GetActiveCamPlusMode()
531+
{
532+
CCam* cam = pGame->GetCamera()->GetCam(pGame->GetCamera()->GetActiveCam());
533+
534+
if (cam == nullptr)
535+
return std::make_pair(cam, MODE_NONE);
536+
537+
return std::make_pair(cam, cam->GetMode());
538+
}
539+
540+
void CSettingsSA::SetFieldOfViewPlayer(float fAngle, bool bFromScript, bool instant)
529541
{
530542
if (!bFromScript && ms_bFOVPlayerFromScript)
531543
return;
544+
532545
ms_bFOVPlayerFromScript = bFromScript;
533546
ms_fFOV = fAngle;
547+
548+
// CCam::Process_FollowPed_SA
534549
MemPut<void*>(0x0522F3A, &ms_fFOV);
535550
MemPut<void*>(0x0522F5D, &ms_fFOV);
536551
MemPut<float>(0x0522F7A, ms_fFOV);
552+
553+
if (instant)
554+
{
555+
const auto pair = GetActiveCamPlusMode();
556+
557+
if (pair.second == MODE_FOLLOWPED)
558+
pair.first->SetFOV(fAngle);
559+
}
537560
}
538561

539-
void CSettingsSA::SetFieldOfViewVehicle(float fAngle, bool bFromScript)
562+
void CSettingsSA::SetFieldOfViewVehicle(float fAngle, bool bFromScript, bool instant)
540563
{
541564
if (!bFromScript && ms_bFOVVehicleFromScript)
542565
return;
566+
543567
ms_bFOVVehicleFromScript = bFromScript;
544568
ms_fFOVCar = fAngle;
569+
570+
// CCam::Process_FollowCar_SA
545571
MemPut<void*>(0x0524B76, &ms_fFOVCar);
546572
MemPut<void*>(0x0524B9A, &ms_fFOVCar);
547573
MemPut<void*>(0x0524BA2, &ms_fFOVCar);
548574
MemPut<void*>(0x0524BD3, &ms_fFOVCar);
549575
MemPut<float>(0x0524BE4, ms_fFOVCar);
576+
577+
if (instant)
578+
{
579+
const auto pair = GetActiveCamPlusMode();
580+
581+
if (pair.second == MODE_BEHINDCAR || pair.second == MODE_CAM_ON_A_STRING || pair.second == MODE_BEHINDBOAT)
582+
pair.first->SetFOV(fAngle);
583+
}
550584
}
551585

552-
void CSettingsSA::SetFieldOfViewVehicleMax(float fAngle, bool bFromScript)
586+
void CSettingsSA::SetFieldOfViewVehicleMax(float fAngle, bool bFromScript, bool instant)
553587
{
588+
(void)instant;
589+
554590
if (!bFromScript && ms_bFOVVehicleFromScript)
555591
return;
592+
556593
ms_bFOVVehicleFromScript = bFromScript;
557594
ms_fFOVCarMax = fAngle;
595+
596+
// CCam::Process_FollowCar_SA
558597
MemPut<void*>(0x0524BB4, &ms_fFOVCarMax);
559598
MemPut<float>(0x0524BC5, ms_fFOVCarMax);
560599
}

Client/game_sa/CSettingsSA.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,9 @@ class CSettingsSA : public CGameSettings
162162

163163
void UpdateFieldOfViewFromSettings();
164164
void ResetFieldOfViewFromScript();
165-
void SetFieldOfViewPlayer(float fAngle, bool bFromScript);
166-
void SetFieldOfViewVehicle(float fAngle, bool bFromScript);
167-
void SetFieldOfViewVehicleMax(float fAngle, bool bFromScript);
165+
void SetFieldOfViewPlayer(float fAngle, bool bFromScript, bool instant = false);
166+
void SetFieldOfViewVehicle(float fAngle, bool bFromScript, bool instant = false);
167+
void SetFieldOfViewVehicleMax(float fAngle, bool bFromScript, bool instant = false);
168168
float GetFieldOfViewPlayer();
169169
float GetFieldOfViewVehicle();
170170
float GetFieldOfViewVehicleMax();

Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "StdInc.h"
1414
#include <game/CPlayerInfo.h>
1515
#include <game/CSettings.h>
16+
#include <game/CCam.h>
1617
#include <lua/CLuaFunctionParser.h>
1718

1819
#define MIN_CLIENT_REQ_SETCAMERATARGET_USE_ANY_ELEMENTS "1.5.8-9.20979"
@@ -215,10 +216,11 @@ int CLuaCameraDefs::SetCameraFieldOfView(lua_State* luaVM)
215216
{
216217
float fFOV;
217218
eFieldOfViewMode eMode;
219+
bool instant;
218220
CScriptArgReader argStream(luaVM);
219-
220221
argStream.ReadEnumString(eMode);
221222
argStream.ReadNumber(fFOV);
223+
argStream.ReadBool(instant, false);
222224

223225
if (!argStream.HasErrors())
224226
{
@@ -231,11 +233,17 @@ int CLuaCameraDefs::SetCameraFieldOfView(lua_State* luaVM)
231233
}
232234

233235
if (eMode == FOV_MODE_PLAYER)
234-
g_pGame->GetSettings()->SetFieldOfViewPlayer(fFOV, true);
236+
{
237+
g_pGame->GetSettings()->SetFieldOfViewPlayer(fFOV, true, instant);
238+
}
235239
else if (eMode == FOV_MODE_VEHICLE)
236-
g_pGame->GetSettings()->SetFieldOfViewVehicle(fFOV, true);
240+
{
241+
g_pGame->GetSettings()->SetFieldOfViewVehicle(fFOV, true, instant);
242+
}
237243
else if (eMode == FOV_MODE_VEHICLE_MAX)
238-
g_pGame->GetSettings()->SetFieldOfViewVehicleMax(fFOV, true);
244+
{
245+
g_pGame->GetSettings()->SetFieldOfViewVehicleMax(fFOV, true, instant);
246+
}
239247
else
240248
{
241249
argStream.m_iIndex = 1;
@@ -567,4 +575,4 @@ bool CLuaCameraDefs::ResetShakeCamera() noexcept
567575
{
568576
m_pManager->GetCamera()->ResetShakeCamera();
569577
return true;
570-
}
578+
}

Client/sdk/game/CSettings.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,9 @@ class CGameSettings
155155

156156
virtual void UpdateFieldOfViewFromSettings() = 0;
157157
virtual void ResetFieldOfViewFromScript() = 0;
158-
virtual void SetFieldOfViewPlayer(float fAngle, bool bFromScript) = 0;
159-
virtual void SetFieldOfViewVehicle(float fAngle, bool bFromScript) = 0;
160-
virtual void SetFieldOfViewVehicleMax(float fAngle, bool bFromScript) = 0;
158+
virtual void SetFieldOfViewPlayer(float fAngle, bool bFromScript, bool instant = false) = 0;
159+
virtual void SetFieldOfViewVehicle(float fAngle, bool bFromScript, bool instant = false) = 0;
160+
virtual void SetFieldOfViewVehicleMax(float fAngle, bool bFromScript, bool instant = false) = 0;
161161

162162
virtual float GetFieldOfViewPlayer() = 0;
163163
virtual float GetFieldOfViewVehicle() = 0;

0 commit comments

Comments
 (0)