Skip to content

Commit 9ff02d5

Browse files
committed
CCamSA, CCameraSA, CCameraRPC fixes
1 parent 41b6576 commit 9ff02d5

File tree

5 files changed

+166
-108
lines changed

5 files changed

+166
-108
lines changed

Client/game_sa/CCamSA.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,14 @@ CEntity* CCamSA::GetTargetEntity() const
2828

2929
void CCamSA::SetTargetEntity(CEntity* pEntity)
3030
{
31-
m_pInterface->CamTargetEntity = pEntity->GetInterface();
31+
if (pEntity)
32+
{
33+
m_pInterface->CamTargetEntity = pEntity->GetInterface();
34+
}
35+
else
36+
{
37+
m_pInterface->CamTargetEntity = nullptr;
38+
}
3239
}
3340

3441
void CCamSA::GetDirection(float& fHorizontal, float& fVertical)

Client/game_sa/CCamSA.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -165,19 +165,19 @@ class CCamSA : public CCam
165165
CCamSA(CCamSAInterface* pInterface) { m_pInterface = pInterface; }
166166
CCamSAInterface* GetInterface() { return m_pInterface; }
167167

168-
CVector* GetFront() const { return &m_pInterface->Front; }
169-
CVector* GetUp() const { return &m_pInterface->Up; }
170-
CVector* GetSource() const { return &m_pInterface->Source; }
171-
unsigned int GetMode() const { return m_pInterface->Mode; }
172-
float GetFOV() const { return m_pInterface->FOV; }
173-
void SetFOV(float fFOV) { m_pInterface->FOV = fFOV; }
174-
void GetDirection(float& fHorizontal, float& fVertical);
175-
void SetDirection(float fHorizontal, float fVertical);
176-
177-
CVector* GetFixedModeSource() const { return &m_pInterface->m_cvecCamFixedModeSource; }
178-
CVector* GetFixedModeVector() const { return &m_pInterface->m_cvecCamFixedModeVector; }
179-
CVector* GetTargetHistoryPos() const { return m_pInterface->m_aTargetHistoryPos; }
180-
181-
CEntity* GetTargetEntity() const;
168+
CVector* GetFront() const override { return &m_pInterface->Front; }
169+
CVector* GetUp() const override { return &m_pInterface->Up; }
170+
CVector* GetSource() const override { return &m_pInterface->Source; }
171+
unsigned int GetMode() const override { return m_pInterface->Mode; }
172+
float GetFOV() const override { return m_pInterface->FOV; }
173+
void SetFOV(float fFOV) override { m_pInterface->FOV = fFOV; }
174+
void GetDirection(float& fHorizontal, float& fVertical) override;
175+
void SetDirection(float fHorizontal, float fVertical) override;
176+
177+
CVector* GetFixedModeSource() const override { return &m_pInterface->m_cvecCamFixedModeSource; }
178+
CVector* GetFixedModeVector() const override { return &m_pInterface->m_cvecCamFixedModeVector; }
179+
CVector* GetTargetHistoryPos() const override { return m_pInterface->m_aTargetHistoryPos; }
180+
181+
CEntity* GetTargetEntity() const override;
182182
void SetTargetEntity(CEntity* pEntity) override;
183183
};

Client/game_sa/CCameraSA.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,17 @@ void CCameraSA::RestoreWithJumpCut()
7777
*/
7878
void CCameraSA::TakeControl(CEntity* entity, eCamMode CamMode, int CamSwitchStyle)
7979
{
80+
if (!entity)
81+
return;
82+
8083
CEntitySA* pEntitySA = dynamic_cast<CEntitySA*>(entity);
8184
if (!pEntitySA)
8285
return;
8386

8487
CEntitySAInterface* entityInterface = pEntitySA->GetInterface();
88+
if (!entityInterface)
89+
return;
90+
8591
CCameraSAInterface* cameraInterface = GetInterface();
8692
// __thiscall
8793

@@ -99,6 +105,9 @@ void CCameraSA::TakeControl(CEntity* entity, eCamMode CamMode, int CamSwitchStyl
99105

100106
void CCameraSA::TakeControl(CVector* position, int CamSwitchStyle)
101107
{
108+
if (!position)
109+
return;
110+
102111
CCameraSAInterface* cameraInterface = GetInterface();
103112
// __thiscall
104113
CVector vecOffset;
@@ -210,7 +219,10 @@ CMatrix* CCameraSA::GetMatrix(CMatrix* matrix)
210219

211220
void CCameraSA::SetMatrix(CMatrix* matrix)
212221
{
213-
CMatrix_Padded* pCamMatrix = GetInterface()->matrix;
222+
if (!matrix)
223+
return;
224+
225+
CMatrix_Padded* pCamMatrix = &GetInterface()->m_cameraMatrix;
214226
if (pCamMatrix)
215227
{
216228
pCamMatrix->vFront = matrix->vFront;
@@ -446,7 +458,7 @@ float CCameraSA::GetShakeForce()
446458

447459
void CCameraSA::ShakeCamera(float radius, float x, float y, float z) noexcept
448460
{
449-
static CCameraSAInterface* cameraInterface = GetInterface();
461+
CCameraSAInterface* cameraInterface = GetInterface();
450462
if (radius <= 0.0f)
451463
return ResetShakeCamera();
452464

Client/game_sa/CCameraSA.h

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -382,40 +382,42 @@ class CCameraSA : public CCamera
382382
~CCameraSA();
383383

384384
CCameraSAInterface* GetInterface() { return internalInterface; };
385-
void TakeControl(CEntity* entity, eCamMode CamMode, int CamSwitchStyle);
386-
void TakeControl(CVector* position, int CamSwitchStyle);
387-
void Restore();
388-
void RestoreWithJumpCut();
389-
CMatrix* GetMatrix(CMatrix* matrix);
390-
void SetMatrix(CMatrix* matrix);
391-
void Find3rdPersonCamTargetVector(float fDistance, CVector* vecGunMuzzle, CVector* vecSource, CVector* vecTarget);
392-
float Find3rdPersonQuickAimPitch();
393-
BYTE GetActiveCam();
394-
395-
CCam* GetCam(BYTE bCameraID);
385+
386+
// CCamera interface implementation
387+
void TakeControl(CEntity* entity, eCamMode CamMode, int CamSwitchStyle) override;
388+
void TakeControl(CVector* position, int CamSwitchStyle) override;
389+
void Restore() override;
390+
void RestoreWithJumpCut() override;
391+
CMatrix* GetMatrix(CMatrix* matrix) override;
392+
void SetMatrix(CMatrix* matrix) override;
393+
void Find3rdPersonCamTargetVector(float fDistance, CVector* vecGunMuzzle, CVector* vecSource, CVector* vecTarget) override;
394+
float Find3rdPersonQuickAimPitch() override;
395+
BYTE GetActiveCam() override;
396+
CCam* GetCam(BYTE bCameraID) override;
397+
void SetWidescreen(bool bWidescreen) override;
398+
bool GetWidescreen() override;
399+
bool IsFading() override;
400+
int GetFadingDirection() override;
401+
void Fade(float fFadeOutTime, int iOutOrIn) override;
402+
void SetFadeColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue) override;
403+
float GetCameraRotation() override;
404+
RwMatrix* GetLTM() override;
405+
CEntity* GetTargetEntity() override;
406+
void SetCameraClip(bool bObjects, bool bVehicles) override;
407+
void GetCameraClip(bool& bObjects, bool& bVehicles) override;
408+
BYTE GetCameraVehicleViewMode() override;
409+
BYTE GetCameraPedViewMode() override;
410+
void SetCameraVehicleViewMode(BYTE dwCamMode) override;
411+
void SetCameraPedViewMode(BYTE dwCamMode) override;
412+
void SetShakeForce(float fShakeForce) override;
413+
float GetShakeForce() override;
414+
void ShakeCamera(float radius, float x, float y, float z) noexcept override;
415+
void ResetShakeCamera() noexcept override;
416+
std::uint8_t GetTransitionState() override;
417+
418+
// Additional overload not in base interface
396419
virtual CCam* GetCam(CCamSAInterface* camInterface);
397-
398-
void SetWidescreen(bool bWidescreen);
399-
bool GetWidescreen();
400-
bool IsFading();
401-
int GetFadingDirection();
402-
void Fade(float fFadeOutTime, int iOutOrIn);
403-
void SetFadeColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue);
404-
float GetCameraRotation();
405-
RwMatrix* GetLTM();
406-
CEntity* GetTargetEntity();
407-
void SetCameraClip(bool bObjects, bool bVehicles);
408-
void GetCameraClip(bool& bObjects, bool& bVehicles);
409-
BYTE GetCameraVehicleViewMode();
410-
BYTE GetCameraPedViewMode();
411-
void SetCameraVehicleViewMode(BYTE dwCamMode);
412-
void SetCameraPedViewMode(BYTE dwCamMode);
420+
421+
// Additional methods
413422
void RestoreLastGoodState();
414-
void SetShakeForce(float fShakeForce);
415-
float GetShakeForce();
416-
417-
void ShakeCamera(float radius, float x, float y, float z) noexcept override;
418-
void ResetShakeCamera() noexcept override;
419-
420-
std::uint8_t GetTransitionState();
421423
};

Client/mods/deathmatch/logic/rpc/CCameraRPCs.cpp

Lines changed: 94 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -23,75 +23,97 @@ void CCameraRPCs::LoadFunctions()
2323
void CCameraRPCs::SetCameraMatrix(NetBitStreamInterface& bitStream)
2424
{
2525
uchar ucTimeContext;
26-
if (bitStream.Read(ucTimeContext))
26+
if (!bitStream.Read(ucTimeContext))
27+
return;
28+
29+
if (m_pCamera)
2730
m_pCamera->SetSyncTimeContext(ucTimeContext);
2831

2932
CVector vecPosition, vecLookAt;
3033
float fRoll = 0.0f;
3134
float fFOV = 70.0f;
32-
if (bitStream.Read(vecPosition.fX) && bitStream.Read(vecPosition.fY) && bitStream.Read(vecPosition.fZ) && bitStream.Read(vecLookAt.fX) &&
33-
bitStream.Read(vecLookAt.fY) && bitStream.Read(vecLookAt.fZ))
35+
36+
if (!bitStream.Read(vecPosition.fX) || !bitStream.Read(vecPosition.fY) || !bitStream.Read(vecPosition.fZ) ||
37+
!bitStream.Read(vecLookAt.fX) || !bitStream.Read(vecLookAt.fY) || !bitStream.Read(vecLookAt.fZ))
3438
{
35-
bitStream.Read(fRoll);
36-
bitStream.Read(fFOV);
39+
return; // Invalid data
40+
}
3741

38-
if (!m_pCamera->IsInFixedMode())
39-
m_pCamera->ToggleCameraFixedMode(true);
42+
bitStream.Read(fRoll);
43+
bitStream.Read(fFOV);
4044

41-
// Put the camera there
42-
m_pCamera->SetPosition(vecPosition);
43-
m_pCamera->SetFixedTarget(vecLookAt, fRoll);
44-
m_pCamera->SetFOV(fFOV);
45-
}
45+
// Validate camera pointer before use
46+
if (!m_pCamera)
47+
return;
48+
49+
if (!m_pCamera->IsInFixedMode())
50+
m_pCamera->ToggleCameraFixedMode(true);
51+
52+
// Put the camera there
53+
m_pCamera->SetPosition(vecPosition);
54+
m_pCamera->SetFixedTarget(vecLookAt, fRoll);
55+
m_pCamera->SetFOV(fFOV);
4656
}
4757

4858
void CCameraRPCs::SetCameraTarget(NetBitStreamInterface& bitStream)
4959
{
5060
uchar ucTimeContext;
51-
if (bitStream.Read(ucTimeContext))
61+
if (!bitStream.Read(ucTimeContext))
62+
return;
63+
64+
if (m_pCamera)
5265
m_pCamera->SetSyncTimeContext(ucTimeContext);
5366

5467
ElementID targetID;
55-
if (bitStream.Read(targetID))
68+
if (!bitStream.Read(targetID))
69+
return;
70+
71+
// Validate camera pointer
72+
if (!m_pCamera)
73+
return;
74+
75+
CClientEntity* pEntity = CElementIDs::GetElement(targetID);
76+
if (!pEntity)
77+
return;
78+
79+
switch (pEntity->GetType())
5680
{
57-
CClientEntity* pEntity = CElementIDs::GetElement(targetID);
58-
if (pEntity)
81+
case CCLIENTPLAYER:
5982
{
60-
switch (pEntity->GetType())
83+
CClientPlayer* pPlayer = static_cast<CClientPlayer*>(pEntity);
84+
if (pPlayer->IsLocalPlayer())
85+
{
86+
// Return the focus to the local player
87+
m_pCamera->SetFocusToLocalPlayer();
88+
}
89+
else
6190
{
62-
case CCLIENTPLAYER:
63-
{
64-
CClientPlayer* pPlayer = static_cast<CClientPlayer*>(pEntity);
65-
if (pPlayer->IsLocalPlayer())
66-
{
67-
// Return the focus to the local player
68-
m_pCamera->SetFocusToLocalPlayer();
69-
}
70-
else
71-
{
72-
// Put the focus on that player
73-
m_pCamera->SetFocus(pPlayer, MODE_CAM_ON_A_STRING, false);
74-
}
75-
break;
76-
}
77-
case CCLIENTPED:
78-
case CCLIENTVEHICLE:
79-
{
80-
m_pCamera->SetFocus(pEntity, MODE_CAM_ON_A_STRING, false);
81-
break;
82-
}
83-
default:
84-
return;
91+
// Put the focus on that player
92+
m_pCamera->SetFocus(pPlayer, MODE_CAM_ON_A_STRING, false);
8593
}
94+
break;
8695
}
96+
case CCLIENTPED:
97+
case CCLIENTVEHICLE:
98+
{
99+
m_pCamera->SetFocus(pEntity, MODE_CAM_ON_A_STRING, false);
100+
break;
101+
}
102+
default:
103+
// Invalid entity type for camera target
104+
return;
87105
}
88106
}
89107

90108
void CCameraRPCs::SetCameraInterior(NetBitStreamInterface& bitStream)
91109
{
92-
// Read out the camera mode
110+
// Read out the camera interior
93111
unsigned char ucInterior;
94-
if (bitStream.Read(ucInterior))
112+
if (!bitStream.Read(ucInterior))
113+
return;
114+
115+
// Validate game pointer before use
116+
if (g_pGame && g_pGame->GetWorld())
95117
{
96118
g_pGame->GetWorld()->SetCurrentArea(ucInterior);
97119
}
@@ -101,26 +123,41 @@ void CCameraRPCs::FadeCamera(NetBitStreamInterface& bitStream)
101123
{
102124
unsigned char ucFadeIn;
103125
float fFadeTime = 1.0f;
104-
if (bitStream.Read(ucFadeIn) && bitStream.Read(fFadeTime))
105-
{
106-
g_pClientGame->SetInitiallyFadedOut(false);
126+
127+
if (!bitStream.Read(ucFadeIn) || !bitStream.Read(fFadeTime))
128+
return;
129+
130+
// Validate pointers before use
131+
if (!m_pCamera || !g_pClientGame)
132+
return;
133+
134+
g_pClientGame->SetInitiallyFadedOut(false);
107135

108-
if (ucFadeIn)
136+
if (ucFadeIn)
137+
{
138+
m_pCamera->FadeIn(fFadeTime);
139+
140+
// Validate game and HUD pointers
141+
if (g_pGame && g_pGame->GetHud())
109142
{
110-
m_pCamera->FadeIn(fFadeTime);
111143
g_pGame->GetHud()->SetComponentVisible(HUD_AREA_NAME, !g_pClientGame->GetHudAreaNameDisabled());
112144
}
113-
else
114-
{
115-
unsigned char ucRed = 0;
116-
unsigned char ucGreen = 0;
117-
unsigned char ucBlue = 0;
145+
}
146+
else
147+
{
148+
unsigned char ucRed = 0;
149+
unsigned char ucGreen = 0;
150+
unsigned char ucBlue = 0;
118151

119-
if (bitStream.Read(ucRed) && bitStream.Read(ucGreen) && bitStream.Read(ucBlue))
120-
{
121-
m_pCamera->FadeOut(fFadeTime, ucRed, ucGreen, ucBlue);
122-
g_pGame->GetHud()->SetComponentVisible(HUD_AREA_NAME, false);
123-
}
152+
if (!bitStream.Read(ucRed) || !bitStream.Read(ucGreen) || !bitStream.Read(ucBlue))
153+
return;
154+
155+
m_pCamera->FadeOut(fFadeTime, ucRed, ucGreen, ucBlue);
156+
157+
// Validate game and HUD pointers
158+
if (g_pGame && g_pGame->GetHud())
159+
{
160+
g_pGame->GetHud()->SetComponentVisible(HUD_AREA_NAME, false);
124161
}
125162
}
126163
}

0 commit comments

Comments
 (0)