Skip to content

Commit 30c64a3

Browse files
committed
* Removed ce_fovoverride_enabled, ce_fovoverride_fov, and ce_fovoverride_zoomed.
* Added ce_fovoverride_firstperson, ce_fovoverride_thirdperson, ce_fovoverride_roaming, ce_fovoverride_fixed, ce_fovoverride_test, and ce_fovoverride_test_enabled.
1 parent 83b1f5f commit 30c64a3

14 files changed

Lines changed: 280 additions & 75 deletions

File tree

CastingEssentials/Hooking/IGroupHook.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ namespace Hooking
2626
{
2727
// Detours a global function.
2828
Global,
29+
30+
// Detours a member function of a class. Applies to all instances, but passes the class
31+
// pointer through to the detour function.
2932
GlobalClass,
33+
34+
// Detours a member function of a class. Applies to all instances.
3035
Class,
3136

3237
// Detours a specific instance of a class (replaces a function pointer in a duplicated vtable).

CastingEssentials/Misc/HLTVCameraHack.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#pragma once
22
#include <client/hltvcamera.h>
33

4+
enum ObserverMode;
5+
46
class HLTVCameraOverride : public C_HLTVCamera
57
{
68
public:
7-
using C_HLTVCamera::m_nCameraMode;
9+
ObserverMode GetMode() const { return (ObserverMode)m_nCameraMode; }
10+
//using C_HLTVCamera::m_nCameraMode;
811
using C_HLTVCamera::m_iCameraMan;
912
using C_HLTVCamera::m_vCamOrigin;
1013
using C_HLTVCamera::m_aCamAngle;

CastingEssentials/Misc/OffsetChecking.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <client/c_baseanimating.h>
2+
#include <client/c_baseplayer.h>
23
#include <vgui_controls/ImagePanel.h>
34
#include <vgui_controls/ProgressBar.h>
45

@@ -14,6 +15,10 @@ class OffsetChecking
1415
OFFSET_CHECK(C_BaseAnimating, m_bDynamicModelPending, 2185);
1516
OFFSET_CHECK(C_BaseAnimating, m_pStudioHdr, 2192);
1617

18+
OFFSET_CHECK(C_BasePlayer, m_iFOVStart, 4152);
19+
OFFSET_CHECK(C_BasePlayer, m_iDefaultFOV, 4160);
20+
OFFSET_CHECK(C_BasePlayer, m_hVehicle, 4300);
21+
1722
OFFSET_CHECK(vgui::ContinuousProgressBar, _unknown0, 388);
1823
OFFSET_CHECK(vgui::ContinuousProgressBar, _unknown1, 392);
1924
OFFSET_CHECK(vgui::ContinuousProgressBar, _unknown2, 396);

CastingEssentials/Modules/CameraSmooths.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,11 @@ bool CameraSmooths::SetupEngineViewOverride(Vector &origin, QAngle &angles, floa
280280
const float frametime = Interfaces::GetEngineTool()->HostFrameTime();
281281
const float hosttime = Interfaces::GetEngineTool()->HostTime();
282282

283-
if (hltvcamera->m_nCameraMode == OBS_MODE_IN_EYE || hltvcamera->m_nCameraMode == OBS_MODE_CHASE)
283+
if (hltvcamera->GetMode() == OBS_MODE_IN_EYE || hltvcamera->GetMode() == OBS_MODE_CHASE)
284284
{
285-
if (hltvcamera->m_iTraget1 != m_EndTarget || (hltvcamera->m_nCameraMode != m_EndMode && !m_InProgress))
285+
if (hltvcamera->m_iTraget1 != m_EndTarget || (hltvcamera->GetMode() != m_EndMode && !m_InProgress))
286286
{
287-
m_EndMode = hltvcamera->m_nCameraMode;
287+
m_EndMode = hltvcamera->GetMode();
288288
m_EndTarget = hltvcamera->m_iTraget1;
289289

290290
Vector currentForward;
@@ -416,7 +416,7 @@ bool CameraSmooths::SetupEngineViewOverride(Vector &origin, QAngle &angles, floa
416416
}
417417
}
418418

419-
m_EndMode = hltvcamera->m_nCameraMode;
419+
m_EndMode = hltvcamera->GetMode();
420420
m_EndTarget = hltvcamera->m_iTraget1;
421421
m_InProgress = false;
422422
m_LastHostTime = hosttime;

CastingEssentials/Modules/CameraState.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ CameraState::CameraState()
2525

2626
ObserverMode CameraState::GetObserverMode()
2727
{
28-
if (auto engineClient = Interfaces::GetEngineClient(); engineClient->IsHLTV())
28+
if (auto engineClient = Interfaces::GetEngineClient(); engineClient && engineClient->IsHLTV())
2929
{
30-
if (auto hltvCamera = Interfaces::GetHLTVCamera(); hltvCamera)
31-
return (ObserverMode)hltvCamera->m_nCameraMode;
30+
if (auto hltvCamera = Interfaces::GetHLTVCamera())
31+
return hltvCamera->GetMode();
3232
}
3333

34-
if (const auto localPlayer = Player::GetLocalPlayer(); localPlayer)
34+
if (const auto localPlayer = Player::GetLocalPlayer())
3535
return localPlayer->GetObserverMode();
3636

3737
Assert(!"Unable to determine current observer mode");

CastingEssentials/Modules/CameraTools.cpp

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "Misc/HLTVCameraHack.h"
33
#include "Modules/CameraSmooths.h"
44
#include "Modules/CameraState.h"
5+
#include "Modules/FOVOverride.h"
56
#include "PluginBase/HookManager.h"
67
#include "PluginBase/Interfaces.h"
78
#include "PluginBase/Player.h"
@@ -67,6 +68,7 @@ CameraTools::CameraTools() :
6768
{
6869
m_SetModeHook = 0;
6970
m_SetPrimaryTargetHook = 0;
71+
m_SwitchReason = ModeSwitchReason::Unknown;
7072
m_SpecGUISettings = new KeyValues("Resource/UI/SpectatorTournament.res");
7173
m_SpecGUISettings->LoadFromFile(g_pFullFileSystem, "resource/ui/spectatortournament.res", "mod");
7274

@@ -164,32 +166,34 @@ bool CameraTools::CheckDependencies()
164166
return ready;
165167
}
166168

167-
void CameraTools::SpecPosition(const Vector& pos, const QAngle& angle, ObserverMode mode)
169+
void CameraTools::SpecPosition(const Vector& pos, const QAngle& angle, ObserverMode mode, float fov)
168170
{
169171
if (Interfaces::GetEngineClient()->IsHLTV())
170172
{
171173
try
172174
{
173175
HLTVCameraOverride* const hltvcamera = Interfaces::GetHLTVCamera();
174176

175-
hltvcamera->m_nCameraMode = mode;
177+
GetHooks()->GetFunc<C_HLTVCamera_SetMode>()(mode);
178+
m_SwitchReason = ModeSwitchReason::SpecPosition;
179+
176180
hltvcamera->m_iCameraMan = 0;
177181
hltvcamera->m_vCamOrigin = pos;
178182
hltvcamera->m_aCamAngle = angle;
179183
hltvcamera->m_iTraget1 = 0;
180184
hltvcamera->m_iTraget2 = 0;
181185
hltvcamera->m_flLastAngleUpdateTime = -1;
182186

187+
if (fov > 0)
188+
hltvcamera->m_flFOV = fov;
189+
183190
// We may have to set angles directly
184191
if (mode == OBS_MODE_ROAMING)
185192
{
186193
QAngle wtf(angle); // Why does this take a non-const reference
187194
Interfaces::GetEngineClient()->SetViewAngles(wtf);
188195
}
189196

190-
static ConVarRef fov_desired("fov_desired");
191-
hltvcamera->m_flFOV = fov_desired.GetFloat();
192-
193197
GetHooks()->GetFunc<C_HLTVCamera_SetCameraAngle>()(hltvcamera->m_aCamAngle);
194198
}
195199
catch (bad_pointer &e)
@@ -455,7 +459,7 @@ void CameraTools::SpecPlayer(int playerIndex)
455459

456460
HLTVCameraOverride* const hltvcamera = Interfaces::GetHLTVCamera();
457461
if (hltvcamera)
458-
hltvcamera->m_nCameraMode = ce_tplock_enable.GetBool() ? OBS_MODE_CHASE : OBS_MODE_IN_EYE;
462+
GetHooks()->GetFunc<C_HLTVCamera_SetMode>()(ce_tplock_enable.GetBool() ? OBS_MODE_CHASE : OBS_MODE_IN_EYE);
459463
}
460464
catch (bad_pointer &e)
461465
{
@@ -474,6 +478,9 @@ void CameraTools::SpecPlayer(int playerIndex)
474478
void CameraTools::OnTick(bool inGame)
475479
{
476480
VPROF_BUDGET(__FUNCTION__, VPROF_BUDGETGROUP_CE);
481+
482+
AttachHooks(inGame);
483+
477484
if (inGame)
478485
{
479486
if (ce_cameratools_show_mode.GetBool())
@@ -483,7 +490,7 @@ void CameraTools::OnTick(bool inGame)
483490
std::string playerName;
484491
if (Interfaces::GetEngineClient()->IsHLTV())
485492
{
486-
mode = Interfaces::GetHLTVCamera()->m_nCameraMode;
493+
mode = Interfaces::GetHLTVCamera()->GetMode();
487494
target = Interfaces::GetHLTVCamera()->m_iTraget1;
488495
if (Player::IsValidIndex(target) && Player::GetPlayer(target, __FUNCSIG__))
489496
playerName = Player::GetPlayer(target, __FUNCSIG__)->GetName();
@@ -508,6 +515,22 @@ void CameraTools::OnTick(bool inGame)
508515
}
509516
}
510517

518+
void CameraTools::AttachHooks(bool attach)
519+
{
520+
if (attach)
521+
{
522+
if (!m_SetModeHook)
523+
m_SetModeHook = GetHooks()->AddHook<C_HLTVCamera_SetMode>(std::bind(&CameraTools::SetModeOverride, this, std::placeholders::_1));
524+
}
525+
else
526+
{
527+
if (m_SetModeHook && GetHooks()->RemoveHook<C_HLTVCamera_SetMode>(m_SetModeHook, __FUNCSIG__))
528+
m_SetModeHook = 0;
529+
530+
Assert(!m_SetModeHook);
531+
}
532+
}
533+
511534
Vector CameraTools::CalcPosForAngle(const Vector& orbitCenter, const QAngle& angle)
512535
{
513536
Vector forward, right, up;
@@ -592,7 +615,7 @@ bool CameraTools::SetupEngineViewOverride(Vector& origin, QAngle& angles, float&
592615
m_LastFrameAngle = idealAngles;
593616
m_LastTargetPlayer = targetPlayer;
594617

595-
if (hltvcamera->m_nCameraMode != OBS_MODE_CHASE)
618+
if (hltvcamera->GetMode() != OBS_MODE_CHASE)
596619
return false;
597620

598621
if (!ce_tplock_enable.GetBool())
@@ -723,10 +746,6 @@ void CameraTools::ChangeForceMode(IConVar *var, const char *pOldValue, float flO
723746

724747
if (forceMode == OBS_MODE_FIXED || forceMode == OBS_MODE_IN_EYE || forceMode == OBS_MODE_CHASE || forceMode == OBS_MODE_ROAMING)
725748
{
726-
if (!m_SetModeHook)
727-
m_SetModeHook = GetHooks()->AddHook<C_HLTVCamera_SetMode>(
728-
std::bind(&CameraTools::SetModeOverride, this, std::placeholders::_1));
729-
730749
try
731750
{
732751
GetHooks()->GetHook<C_HLTVCamera_SetMode>()->GetOriginal()(forceMode);
@@ -738,13 +757,8 @@ void CameraTools::ChangeForceMode(IConVar *var, const char *pOldValue, float flO
738757
}
739758
else
740759
{
760+
PluginWarning("%s: Unsupported spec_mode \"%s\"", var->GetName(), ce_cameratools_autodirector_mode.GetString());
741761
var->SetValue(OBS_MODE_NONE);
742-
743-
if (m_SetModeHook)
744-
{
745-
GetHooks()->RemoveHook<C_HLTVCamera_SetMode>(m_SetModeHook, __FUNCSIG__);
746-
m_SetModeHook = 0;
747-
}
748762
}
749763
}
750764

@@ -762,6 +776,8 @@ void CameraTools::SetModeOverride(int iMode)
762776
GetHooks()->GetOriginal<C_HLTVCamera_SetMode>()(iMode);
763777
GetHooks()->GetHook<C_HLTVCamera_SetMode>()->SetState(Hooking::HookAction::SUPERCEDE);
764778
}
779+
780+
m_SwitchReason = ModeSwitchReason::Unknown;
765781
}
766782

767783
void CameraTools::SetPrimaryTargetOverride(int nEntity)
@@ -875,7 +891,7 @@ void CameraTools::SpecPosition(const CCommand &command)
875891
QAngle pluginAng;
876892
CameraState::GetModule()->GetLastFramePluginView(pluginPos, pluginAng);
877893

878-
const ObserverMode defaultMode = (ObserverMode)Interfaces::GetHLTVCamera()->m_nCameraMode;
894+
const ObserverMode defaultMode = (ObserverMode)Interfaces::GetHLTVCamera()->GetMode();
879895

880896
// Legacy support, we used to always force OBS_MODE_FIXED
881897
if (ParseSpecPosCommand(command, pos, ang, mode, pluginPos, pluginAng, defaultMode))
@@ -888,7 +904,7 @@ void CameraTools::SpecPositionDelta(const CCommand& command)
888904
QAngle ang;
889905
ObserverMode mode;
890906

891-
const ObserverMode defaultMode = (ObserverMode)Interfaces::GetHLTVCamera()->m_nCameraMode;
907+
const ObserverMode defaultMode = (ObserverMode)Interfaces::GetHLTVCamera()->GetMode();
892908

893909
if (ParseSpecPosCommand(command, pos, ang, mode, vec3_origin, vec3_angle, defaultMode))
894910
{

CastingEssentials/Modules/CameraTools.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ class C_HLTVCamera;
1616
class C_BaseEntity;
1717
class Player;
1818

19+
enum class ModeSwitchReason
20+
{
21+
Unknown,
22+
SpecPosition,
23+
};
24+
1925
class CameraTools final : public Module<CameraTools>, public ICameraOverride
2026
{
2127
public:
@@ -24,16 +30,17 @@ class CameraTools final : public Module<CameraTools>, public ICameraOverride
2430

2531
static bool CheckDependencies();
2632

27-
void SpecPosition(const Vector& pos, const QAngle& angle, ObserverMode mode = OBS_MODE_FIXED);
33+
void SpecPosition(const Vector& pos, const QAngle& angle, ObserverMode mode = OBS_MODE_FIXED, float fov = -1);
2834

2935
static float CollisionTest3D(const Vector& startPos, const Vector& targetPos, float scale,
3036
const IHandleEntity* ignoreEnt = nullptr);
3137

32-
38+
ModeSwitchReason GetModeSwitchReason() const { return m_SwitchReason; }
3339

3440
private:
3541
int m_SetModeHook;
3642
int m_SetPrimaryTargetHook;
43+
int m_GetDefaultFOVHook;
3744
KeyValues* m_SpecGUISettings;
3845

3946
void SetModeOverride(int iMode);
@@ -94,7 +101,12 @@ class CameraTools final : public Module<CameraTools>, public ICameraOverride
94101
bool InToolModeOverride() const override { return m_ViewOverride; }
95102
bool IsThirdPersonCameraOverride() const override { return m_ViewOverride; }
96103
bool SetupEngineViewOverride(Vector& origin, QAngle& angles, float& fov) override;
104+
int GetDefaultFOVOverride() const;
97105
bool m_ViewOverride;
98106
QAngle m_LastFrameAngle;
99107
Player* m_LastTargetPlayer;
108+
109+
void AttachHooks(bool attach);
110+
111+
ModeSwitchReason m_SwitchReason;
100112
};

0 commit comments

Comments
 (0)