Skip to content

Commit fd228c3

Browse files
TheNormalnijStrixGpatrikjuvonen
authored
Allow to change player camera mode (#1418)
Co-authored-by: Nikita Obrekht <obrekht@gmail.com> Co-authored-by: Patrik Juvonen <22572159+patrikjuvonen@users.noreply.github.com>
1 parent cf4b886 commit fd228c3

File tree

9 files changed

+74
-61
lines changed

9 files changed

+74
-61
lines changed

Client/game_sa/CCameraSA.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -581,17 +581,26 @@ void _declspec(naked) HOOK_Camera_CollisionDetection()
581581
}
582582
}
583583

584-
BYTE CCameraSA::GetCameraViewMode()
584+
BYTE CCameraSA::GetCameraVehicleViewMode()
585585
{
586-
// TODO: Add support for ped camera view, this will only work on vehicles for now.
587586
return *(BYTE*)VAR_VehicleCameraView;
588587
}
589588

590-
VOID CCameraSA::SetCameraViewMode(BYTE dwCamMode)
589+
BYTE CCameraSA::GetCameraPedViewMode()
590+
{
591+
return *(BYTE*)VAR_PedCameraView;
592+
}
593+
594+
VOID CCameraSA::SetCameraVehicleViewMode(BYTE dwCamMode)
591595
{
592596
MemPutFast<BYTE>(VAR_VehicleCameraView, dwCamMode);
593597
}
594598

599+
VOID CCameraSA::SetCameraPedViewMode(BYTE dwCamMode)
600+
{
601+
MemPutFast<BYTE>(VAR_PedCameraView, dwCamMode);
602+
}
603+
595604
void CCameraSA::SetShakeForce(float fShakeForce)
596605
{
597606
CCameraSAInterface* pCameraInterface = GetInterface();

Client/game_sa/CCameraSA.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#define VAR_ActiveCam 0x7E46FE
3939
#define VAR_CameraRotation 0xB6F178 // used for controling where the player faces
4040
#define VAR_VehicleCameraView 0xB6F0DC
41+
#define VAR_PedCameraView 0xB6F0F0
4142

4243
#define MAX_CAMS 3
4344

@@ -433,8 +434,10 @@ class CCameraSA : public CCamera
433434
CEntity* GetTargetEntity();
434435
void SetCameraClip(bool bObjects, bool bVehicles);
435436
void GetCameraClip(bool& bObjects, bool& bVehicles);
436-
BYTE GetCameraViewMode();
437-
VOID SetCameraViewMode(BYTE dwCamMode);
437+
BYTE GetCameraVehicleViewMode();
438+
BYTE GetCameraPedViewMode();
439+
VOID SetCameraVehicleViewMode(BYTE dwCamMode);
440+
VOID SetCameraPedViewMode(BYTE dwCamMode);
438441
void RestoreLastGoodState();
439442
void SetShakeForce(float fShakeForce);
440443
float GetShakeForce();

Client/mods/deathmatch/logic/CClientCamera.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -481,14 +481,24 @@ void CClientCamera::RestoreEntity(CClientEntity* pEntity)
481481
}
482482
}
483483

484-
void CClientCamera::SetCameraViewMode(eVehicleCamMode eMode)
484+
void CClientCamera::SetCameraVehicleViewMode(eVehicleCamMode eMode)
485485
{
486-
m_pCamera->SetCameraViewMode(eMode);
486+
m_pCamera->SetCameraVehicleViewMode((unsigned short)eMode);
487487
}
488488

489-
eVehicleCamMode CClientCamera::GetCameraViewMode()
489+
void CClientCamera::SetCameraPedViewMode(ePedCamMode eMode)
490490
{
491-
return (eVehicleCamMode)m_pCamera->GetCameraViewMode();
491+
m_pCamera->SetCameraPedViewMode((unsigned short)eMode);
492+
}
493+
494+
eVehicleCamMode CClientCamera::GetCameraVehicleViewMode()
495+
{
496+
return (eVehicleCamMode)m_pCamera->GetCameraVehicleViewMode();
497+
}
498+
499+
ePedCamMode CClientCamera::GetCameraPedViewMode()
500+
{
501+
return (ePedCamMode)m_pCamera->GetCameraPedViewMode();
492502
}
493503

494504
void CClientCamera::SetCameraClip(bool bObjects, bool bVehicles)

Client/mods/deathmatch/logic/CClientCamera.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ class CClientCamera final : public CClientEntity
6161
void SetFocus(CClientPlayer* pPlayer, eCamMode eMode, bool bSmoothTransition = false);
6262
void SetFocusToLocalPlayer();
6363

64-
void SetCameraViewMode(eVehicleCamMode eMode);
65-
eVehicleCamMode GetCameraViewMode();
64+
void SetCameraVehicleViewMode(eVehicleCamMode eMode);
65+
void SetCameraPedViewMode(ePedCamMode eMode);
66+
eVehicleCamMode GetCameraVehicleViewMode();
67+
ePedCamMode GetCameraPedViewMode();
6668
void SetCameraClip(bool bObjects, bool bVehicles);
6769
void GetCameraClip(bool& bObjects, bool& bVehicles);
6870

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4897,18 +4897,6 @@ bool CStaticFunctionDefinitions::FadeCamera(bool bFadeIn, float fFadeTime, unsig
48974897
return true;
48984898
}
48994899

4900-
bool CStaticFunctionDefinitions::SetCameraViewMode(unsigned short ucMode)
4901-
{
4902-
m_pCamera->SetCameraViewMode((eVehicleCamMode)ucMode);
4903-
return true;
4904-
}
4905-
4906-
bool CStaticFunctionDefinitions::GetCameraViewMode(unsigned short& ucMode)
4907-
{
4908-
ucMode = m_pCamera->GetCameraViewMode();
4909-
return true;
4910-
}
4911-
49124900
bool CStaticFunctionDefinitions::GetCursorPosition(CVector2D& vecCursor, CVector& vecWorld)
49134901
{
49144902
if (m_pClientGame->AreCursorEventsEnabled() || GUIGetInputEnabled())

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,6 @@ class CStaticFunctionDefinitions
380380
static bool SetMarkerIcon(CClientEntity& Entity, const char* szIcon);
381381

382382
// Camera get funcs
383-
static bool GetCameraViewMode(unsigned short& ucMode);
384383
static bool GetCameraMatrix(CVector& vecPosition, CVector& vecLookAt, float& fRoll, float& fFOV);
385384
static CClientEntity* GetCameraTarget();
386385
static bool GetCameraInterior(unsigned char& ucInterior);
@@ -391,7 +390,6 @@ class CStaticFunctionDefinitions
391390
static bool SetCameraTarget(const CVector& vecTarget);
392391
static bool SetCameraInterior(unsigned char ucInterior);
393392
static bool FadeCamera(bool bFadeIn, float fFadeTime, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue);
394-
static bool SetCameraViewMode(unsigned short ucMode);
395393

396394
// Cursor funcs
397395
static bool GetCursorPosition(CVector2D& vecCursor, CVector& vecWorld);

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

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111
*****************************************************************************/
1212

1313
#include "StdInc.h"
14+
#include <lua/CLuaFunctionParser.h>
1415

1516
void CLuaCameraDefs::LoadFunctions()
1617
{
1718
constexpr static const std::pair<const char*, lua_CFunction> functions[]{
1819
// Cam get funcs
1920
{"getCamera", GetCamera},
20-
{"getCameraViewMode", GetCameraViewMode},
21+
{"getCameraViewMode", ArgumentParserWarn<false, GetCameraViewMode>},
2122
{"getCameraMatrix", GetCameraMatrix},
2223
{"getCameraTarget", GetCameraTarget},
2324
{"getCameraInterior", GetCameraInterior},
@@ -33,7 +34,7 @@ void CLuaCameraDefs::LoadFunctions()
3334
{"fadeCamera", FadeCamera},
3435
{"setCameraClip", SetCameraClip},
3536
{"getCameraClip", GetCameraClip},
36-
{"setCameraViewMode", SetCameraViewMode},
37+
{"setCameraViewMode", ArgumentParserWarn<false, SetCameraViewMode>},
3738
{"setCameraGoggleEffect", SetCameraGoggleEffect},
3839
{"setCameraShakeLevel", SetCameraShakeLevel},
3940
};
@@ -102,17 +103,14 @@ int CLuaCameraDefs::GetCamera(lua_State* luaVM)
102103
return 1;
103104
}
104105

105-
int CLuaCameraDefs::GetCameraViewMode(lua_State* luaVM)
106+
CLuaMultiReturn<unsigned char, unsigned char> CLuaCameraDefs::GetCameraViewMode()
106107
{
107-
unsigned short ucMode;
108-
if (CStaticFunctionDefinitions::GetCameraViewMode(ucMode))
109-
{
110-
lua_pushnumber(luaVM, ucMode);
111-
return 1;
112-
}
108+
CClientCamera* pCamera = g_pClientGame->GetManager()->GetCamera();
113109

114-
lua_pushboolean(luaVM, false);
115-
return 1;
110+
unsigned char ucVehicleMode = (unsigned char)pCamera->GetCameraVehicleViewMode();
111+
unsigned char ucPedMode = (unsigned char)pCamera->GetCameraPedViewMode();
112+
113+
return {ucVehicleMode, ucPedMode};
116114
}
117115

118116
int CLuaCameraDefs::GetCameraMatrix(lua_State* luaVM)
@@ -439,24 +437,17 @@ int CLuaCameraDefs::GetCameraClip(lua_State* luaVM)
439437
return 2;
440438
}
441439

442-
int CLuaCameraDefs::SetCameraViewMode(lua_State* luaVM)
440+
bool CLuaCameraDefs::SetCameraViewMode(std::optional<unsigned char> ucVehicleViewMode, std::optional<unsigned char> ucPedViewMode)
443441
{
444-
unsigned short usViewMode = 0;
445-
CScriptArgReader argStream(luaVM);
446-
argStream.ReadNumber(usViewMode);
442+
CClientCamera* pCamera = g_pClientGame->GetManager()->GetCamera();
447443

448-
if (!argStream.HasErrors())
449-
{
450-
CStaticFunctionDefinitions::SetCameraViewMode(usViewMode);
444+
if (ucVehicleViewMode)
445+
pCamera->SetCameraVehicleViewMode((eVehicleCamMode)ucVehicleViewMode.value());
451446

452-
lua_pushboolean(luaVM, true);
453-
return 1;
454-
}
455-
else
456-
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());
447+
if (ucPedViewMode)
448+
pCamera->SetCameraPedViewMode((ePedCamMode)ucPedViewMode.value());
457449

458-
lua_pushboolean(luaVM, false);
459-
return 1;
450+
return true;
460451
}
461452

462453
int CLuaCameraDefs::SetCameraGoggleEffect(lua_State* luaVM)

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@
1010

1111
#pragma once
1212
#include "CLuaDefs.h"
13+
#include <lua/CLuaMultiReturn.h>
14+
#include <optional>
1315

1416
class CLuaCameraDefs : public CLuaDefs
1517
{
1618
public:
1719
static void LoadFunctions();
1820
static void AddClass(lua_State* luaVM);
1921

22+
static bool SetCameraViewMode(std::optional<unsigned char> usVehicleViewMode, std::optional<unsigned char> usPedViewMode);
23+
static CLuaMultiReturn<unsigned char, unsigned char> GetCameraViewMode();
24+
2025
// Cam get funcs
2126
LUA_DECLARE(GetCamera);
22-
LUA_DECLARE(GetCameraViewMode);
2327
LUA_DECLARE_OOP(GetCameraMatrix);
2428
LUA_DECLARE(GetCameraTarget);
2529
LUA_DECLARE(GetCameraInterior);
@@ -35,7 +39,6 @@ class CLuaCameraDefs : public CLuaDefs
3539
LUA_DECLARE(FadeCamera);
3640
LUA_DECLARE(SetCameraClip);
3741
LUA_DECLARE(GetCameraClip);
38-
LUA_DECLARE(SetCameraViewMode);
3942
LUA_DECLARE(SetCameraGoggleEffect);
4043
LUA_DECLARE(SetCameraShakeLevel);
4144

Client/sdk/game/CCamera.h

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,21 @@ enum eCamMode
8585
MODE_AIMWEAPON_ATTACHED // 65
8686
};
8787

88-
enum eVehicleCamMode
88+
enum class eVehicleCamMode
8989
{
90-
MODE_BUMPER,
91-
MODE_CLOSE_EXTERNAL,
92-
MODE_MIDDLE_EXTERNAL,
93-
MODE_FAR_EXTERNAL,
94-
MODE_LOW_EXTERNAL,
95-
MODE_CINEMATIC
90+
BUMPER,
91+
CLOSE_EXTERNAL,
92+
MIDDLE_EXTERNAL,
93+
FAR_EXTERNAL,
94+
LOW_EXTERNAL,
95+
CINEMATIC
96+
};
97+
98+
enum class ePedCamMode
99+
{
100+
CLOSE,
101+
MIDDLE,
102+
MAX,
96103
};
97104

98105
enum
@@ -135,8 +142,10 @@ class CCamera
135142
virtual CEntity* GetTargetEntity() = 0;
136143
virtual void SetCameraClip(bool bObjects, bool bVehicles) = 0;
137144
virtual void GetCameraClip(bool& bObjects, bool& bVehicles) = 0;
138-
virtual VOID SetCameraViewMode(BYTE dwCamMode) = 0;
139-
virtual BYTE GetCameraViewMode() = 0;
145+
virtual VOID SetCameraVehicleViewMode(BYTE dwCamMode) = 0;
146+
virtual VOID SetCameraPedViewMode(BYTE dwCamMode) = 0;
147+
virtual BYTE GetCameraVehicleViewMode() = 0;
148+
virtual BYTE GetCameraPedViewMode() = 0;
140149
virtual void SetShakeForce(float fShakeForce) = 0;
141150
virtual float GetShakeForce() = 0;
142151
};

0 commit comments

Comments
 (0)