Skip to content

Commit 83b1f5f

Browse files
committed
Repeated usage of ce_autocamera_spec_player free/fixed should work now.
1 parent 202d2e3 commit 83b1f5f

3 files changed

Lines changed: 43 additions & 10 deletions

File tree

CastingEssentials/Modules/AutoCameras.cpp

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ AutoCameras::AutoCameras() :
4747
"\tIf our position is not in any autocamera's view frustum, find the nearest/furthest autocamera to our current position."),
4848

4949
ce_autocamera_spec_player("ce_autocamera_spec_player", [](const CCommand& args) { GetModule()->SpecPlayer(args); }, "Switches to an autocamera with the best view of the current player."),
50-
ce_autocamera_spec_player_fallback("ce_autocamera_spec_player_fallback", "firstperson", FCVAR_NONE, "Behavior to fall back to when using ce_autocamera_spec_player and no autocameras make it through the filters. Valid values: firstperson/thirdperson/fixed/none."),
50+
ce_autocamera_spec_player_fallback("ce_autocamera_spec_player_fallback", "firstperson", FCVAR_NONE,
51+
"Behavior to fall back to when using ce_autocamera_spec_player and no autocameras make it through the filters. Valid values: firstperson/thirdperson/none."),
5152
ce_autocamera_spec_player_fov("ce_autocamera_spec_player_fov", "75", FCVAR_NONE,
5253
"FOV to use when checking if a player is in view of an autocamera. -1 to disable check."),
5354
ce_autocamera_spec_player_dist("ce_autocamera_spec_player_dist", "2000", FCVAR_NONE, "Maximum distance a player can be from an autocamera."),
@@ -811,7 +812,6 @@ void AutoCameras::CycleCamera(const CCommand& args)
811812
if (idealCameraLOS && (dir == NEXT) ? (idealCameraLOSDist < thisDist) : (idealCameraLOSDist > thisDist))
812813
continue; // Already have a better camera with LOS
813814

814-
constexpr float test = 100000;
815815
Frustum_t frustum;
816816
GeneratePerspectiveFrustum(camera->m_Pos, camera->m_DefaultAngle, 1, 100000, 90, (16.0 / 9.0), frustum);
817817

@@ -879,14 +879,25 @@ void AutoCameras::SpecPlayer(const CCommand& args)
879879
}
880880
#endif
881881

882-
Player* localObserverTarget = Player::GetLocalObserverTarget();
883-
if (!localObserverTarget)
882+
const auto camState = CameraState::GetModule();
883+
if (!camState)
884884
{
885-
PluginWarning("%s: Not currently spectating a player\n", args.Arg(0));
885+
PluginWarning("%s: Camera State module not loaded\n", args.Arg(0));
886886
return;
887887
}
888888

889-
const auto observedOrigin = localObserverTarget->GetAbsOrigin();
889+
C_BaseEntity* observeTarget;
890+
{
891+
if (auto playerTarget = Player::GetLocalObserverTarget())
892+
observeTarget = playerTarget->GetBaseEntity();
893+
else if (auto lastTarget = camState->GetLastSpecTarget())
894+
observeTarget = lastTarget;
895+
else
896+
{
897+
PluginWarning("%s: Not currently spectating a player\n", args.Arg(0));
898+
return;
899+
}
900+
}
890901

891902
ObserverMode mode;
892903
bool bFollow = false;
@@ -908,6 +919,8 @@ void AutoCameras::SpecPlayer(const CCommand& args)
908919
if (ce_autocamera_spec_player_debug.GetBool())
909920
Msg("Scoring cameras:\n");
910921

922+
const auto observedOrigin = observeTarget->GetAbsOrigin();
923+
911924
float bestCameraScore = -std::numeric_limits<float>::max();
912925
const Camera* bestCamera = nullptr;
913926
for (const auto& camera : m_Cameras)
@@ -935,8 +948,6 @@ void AutoCameras::SpecPlayer(const CCommand& args)
935948
mode = OBS_MODE_IN_EYE;
936949
else if (!stricmp(fallback, "thirdperson"))
937950
mode = OBS_MODE_CHASE;
938-
else if (!stricmp(fallback, "fixed"))
939-
mode = OBS_MODE_FIXED;
940951
else if (!stricmp(fallback, "none"))
941952
return;
942953
else
@@ -953,7 +964,6 @@ void AutoCameras::SpecPlayer(const CCommand& args)
953964

954965
Assert(bestCamera);
955966

956-
const auto camState = CameraState::GetModule();
957967
if (bestCamera != m_LastActiveCamera ||
958968
!VectorsAreEqual(camState->GetLastFramePluginViewOrigin(), m_LastActiveCamera->m_Pos, 25) ||
959969
(!bFollow && !QAnglesAreEqual(camState->GetLastFramePluginViewAngles(), m_LastActiveCamera->m_DefaultAngle)))
@@ -969,7 +979,7 @@ void AutoCameras::SpecPlayer(const CCommand& args)
969979
}
970980

971981
if (bFollow)
972-
GetHooks()->GetFunc<C_HLTVCamera_SetPrimaryTarget>()(localObserverTarget->entindex());
982+
GetHooks()->GetFunc<C_HLTVCamera_SetPrimaryTarget>()(observeTarget->entindex());
973983
}
974984

975985
float AutoCameras::ScoreSpecPlayerCamera(const Camera& camera, const Vector& position, const IHandleEntity* targetEnt) const

CastingEssentials/Modules/CameraState.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ CameraState::CameraState()
2020
m_InToolModeHook = 0;
2121
m_IsThirdPersonCameraHook = 0;
2222
m_SetupEngineViewHook = 0;
23+
m_LastSpecTarget = 0;
2324
}
2425

2526
ObserverMode CameraState::GetObserverMode()
@@ -37,6 +38,19 @@ ObserverMode CameraState::GetObserverMode()
3738
return OBS_MODE_NONE;
3839
}
3940

41+
C_BaseEntity* CameraState::GetLastSpecTarget() const
42+
{
43+
if (m_LastSpecTarget < 0 || m_LastSpecTarget > MAX_EDICTS)
44+
return nullptr;
45+
46+
auto list = Interfaces::GetClientEntityList();
47+
if (!list)
48+
return nullptr;
49+
50+
auto clientEnt = list->GetClientEntity(m_LastSpecTarget);
51+
return clientEnt ? clientEnt->GetBaseEntity() : nullptr;
52+
}
53+
4054
bool CameraState::InToolModeOverride()
4155
{
4256
VPROF_BUDGET(__FUNCTION__, VPROF_BUDGETGROUP_CE);
@@ -112,6 +126,10 @@ void CameraState::OnTick(bool inGame)
112126
{
113127
if (!m_HooksAttached)
114128
SetupHooks(m_HooksAttached = true);
129+
130+
// Update last spec target
131+
if (auto primaryTarget = Interfaces::GetHLTVCamera()->m_iTraget1; primaryTarget > 0 && primaryTarget < MAX_EDICTS)
132+
m_LastSpecTarget = primaryTarget;
115133
}
116134
else
117135
{

CastingEssentials/Modules/CameraState.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <mathlib/vector.h>
66

7+
class C_BaseEntity;
78
enum ObserverMode;
89
class Player;
910

@@ -22,6 +23,8 @@ class CameraState final : public Module<CameraState>
2223

2324
static ObserverMode GetObserverMode();
2425

26+
C_BaseEntity* GetLastSpecTarget() const;
27+
2528
private:
2629
bool InToolModeOverride();
2730
bool IsThirdPersonCameraOverride();
@@ -53,6 +56,8 @@ class CameraState final : public Module<CameraState>
5356
bool m_LastFrameIsThirdPerson;
5457
bool m_ThisFrameIsThirdPerson;
5558

59+
int m_LastSpecTarget;
60+
5661
void Invalidate(bool& b);
5762

5863
bool m_HooksAttached;

0 commit comments

Comments
 (0)