AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
CinematicMgr Class Reference

#include "CinematicMgr.h"

Public Member Functions

 CinematicMgr (Player &player)
 
 ~CinematicMgr ()=default
 
void StartCinematic (uint32 const cinematicSequenceId)
 
uint32 GetActiveCinematicCamera () const
 
void SetActiveCinematicCamera (uint32 cinematicCameraId=0)
 
bool IsOnCinematic () const
 
void StartCinematicCamera ()
 
void EndCinematic ()
 
void UpdateCinematic (uint32 const diff)
 
Position const & GetRemoteSightPosition () const
 

Private Attributes

Player_player
 
uint32 _cinematicDiff
 
uint32 _activeCinematicCameraId
 
std::vector< FlyByCamera > const * _cinematicCamera
 
Position _remoteSightPosition
 
IntervalTimer _cinematicUpdateTimer
 

Detailed Description

Constructor & Destructor Documentation

◆ CinematicMgr()

CinematicMgr::CinematicMgr ( Player player)
explicit
22 : _player(player)
23{
26 _cinematicCamera = nullptr;
27 _remoteSightPosition = Position(0.0f, 0.0f, 0.0f);
29}
constexpr auto CINEMATIC_UPDATEDIFF
Definition CinematicMgr.h:26
Player & _player
Definition CinematicMgr.h:49
Position _remoteSightPosition
Definition CinematicMgr.h:53
uint32 _cinematicDiff
Definition CinematicMgr.h:50
uint32 _activeCinematicCameraId
Definition CinematicMgr.h:51
IntervalTimer _cinematicUpdateTimer
Definition CinematicMgr.h:54
std::vector< FlyByCamera > const * _cinematicCamera
Definition CinematicMgr.h:52
void SetInterval(time_t interval)
Definition Timer.h:179
Definition Position.h:27

References _activeCinematicCameraId, _cinematicCamera, _cinematicDiff, _cinematicUpdateTimer, _remoteSightPosition, CINEMATIC_UPDATEDIFF, and IntervalTimer::SetInterval().

◆ ~CinematicMgr()

CinematicMgr::~CinematicMgr ( )
default

Member Function Documentation

◆ EndCinematic()

void CinematicMgr::EndCinematic ( )
66{
68 return;
69
72 _cinematicCamera = nullptr;
75}
void UpdateVisibilityForPlayer(bool mapChange=false)
Definition PlayerUpdates.cpp:1597
void Reset()
Definition Timer.h:166

References _activeCinematicCameraId, _cinematicCamera, _cinematicDiff, _cinematicUpdateTimer, _player, IntervalTimer::Reset(), and Player::UpdateVisibilityForPlayer().

Referenced by WorldSession::HandleCompleteCinematic(), and UpdateCinematic().

◆ GetActiveCinematicCamera()

uint32 CinematicMgr::GetActiveCinematicCamera ( ) const
inline

◆ GetRemoteSightPosition()

Position const & CinematicMgr::GetRemoteSightPosition ( ) const
inline
46{ return _remoteSightPosition; }

Referenced by Player::GetSightPosition().

◆ IsOnCinematic()

bool CinematicMgr::IsOnCinematic ( ) const
inline
42{ return (_cinematicCamera != nullptr); }

Referenced by Player::GetSightPosition().

◆ SetActiveCinematicCamera()

void CinematicMgr::SetActiveCinematicCamera ( uint32  cinematicCameraId = 0)
inline
41{ _activeCinematicCameraId = cinematicCameraId; }

Referenced by StartCinematic().

◆ StartCinematic()

void CinematicMgr::StartCinematic ( uint32 const  cinematicSequenceId)
32{
33 _player.SendCinematicStart(cinematicSequenceId);
34 if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(cinematicSequenceId))
35 SetActiveCinematicCamera(sequence->cinematicCamera);
36}
DBCStorage< CinematicSequencesEntry > sCinematicSequencesStore(CinematicSequencesEntryfmt)
void SetActiveCinematicCamera(uint32 cinematicCameraId=0)
Definition CinematicMgr.h:41
void SendCinematicStart(uint32 CinematicSequenceId) const
Definition Player.cpp:5685
Definition DBCStructure.h:713

References _player, sCinematicSequencesStore, Player::SendCinematicStart(), and SetActiveCinematicCamera().

Referenced by debug_commandscript::HandleDebugPlayCinematicCommand(), WorldSession::HandlePlayerLoginFromDB(), and GameObject::Use().

◆ StartCinematicCamera()

void CinematicMgr::StartCinematicCamera ( )
39{
40 // Sanity check for active camera set
42 return;
43
44 if (std::vector<FlyByCamera> const* flyByCameras = GetFlyByCameras(_activeCinematicCameraId))
45 {
46 // Initialize diff, and set camera
49 _cinematicCamera = flyByCameras;
50
51 auto camitr = _cinematicCamera->begin();
52 if (camitr != _cinematicCamera->end())
53 {
54 Position const& pos = camitr->locations;
55 if (!pos.IsPositionValid())
56 return;
57
61 }
62 }
63}
std::vector< FlyByCamera > const * GetFlyByCameras(uint32 cinematicCameraId)
Definition M2Stores.cpp:254
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:30
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:224
Map * GetMap() const
Definition Object.h:625
bool IsPositionValid() const
Definition Position.cpp:183
void Relocate(float x, float y)
Definition Position.h:77

References _activeCinematicCameraId, _cinematicCamera, _cinematicDiff, _cinematicUpdateTimer, _player, _remoteSightPosition, GetFlyByCameras(), WorldObject::GetMap(), Position::IsPositionValid(), Map::LoadGridsInRange(), MAX_VISIBILITY_DISTANCE, Position::Relocate(), IntervalTimer::Reset(), and Player::UpdateVisibilityForPlayer().

Referenced by WorldSession::HandleNextCinematicCamera().

◆ UpdateCinematic()

void CinematicMgr::UpdateCinematic ( uint32 const  diff)
78{
80 return;
81
82 _cinematicDiff += diff;
85 return;
86
88
89 Position lastPosition;
90 uint32 lastTimestamp = 0;
91 Position nextPosition;
92 uint32 nextTimestamp = 0;
93
94 // Obtain direction of travel
95 for (FlyByCamera const& cam : *_cinematicCamera)
96 {
97 if (cam.timeStamp > _cinematicDiff)
98 {
99 nextPosition.Relocate(cam.locations);
100 nextTimestamp = cam.timeStamp;
101 break;
102 }
103 lastPosition.Relocate(cam.locations);
104 lastTimestamp = cam.timeStamp;
105 }
106 float angle = lastPosition.GetAbsoluteAngle(&nextPosition);
107 angle -= lastPosition.GetOrientation();
108 angle = Position::NormalizeOrientation(angle);
109
110 // Look for position around 2 second ahead of us.
111 int32 workDiff = _cinematicDiff;
112
113 // Modify result based on camera direction (Humans for example, have the camera point behind)
114 workDiff += static_cast<int32>(float(CINEMATIC_LOOKAHEAD) * cos(angle));
115
116 // Get an iterator to the last entry in the cameras, to make sure we don't go beyond the end
117 auto endItr = _cinematicCamera->rbegin();
118 if (endItr != _cinematicCamera->rend() && workDiff > static_cast<int32>(endItr->timeStamp))
119 workDiff = endItr->timeStamp;
120
121 // Never try to go back in time before the start of cinematic!
122 if (workDiff < 0)
123 workDiff = _cinematicDiff;
124
125 // Obtain the previous and next waypoint based on timestamp
126 for (FlyByCamera const& cam : *_cinematicCamera)
127 {
128 if (static_cast<int32>(cam.timeStamp) >= workDiff)
129 {
130 nextPosition.Relocate(cam.locations);
131 nextTimestamp = cam.timeStamp;
132 break;
133 }
134 lastPosition.Relocate(cam.locations);
135 lastTimestamp = cam.timeStamp;
136 }
137
138 // Never try to go beyond the end of the cinematic
139 if (workDiff > static_cast<int32>(nextTimestamp))
140 workDiff = static_cast<int32>(nextTimestamp);
141
142 // Interpolate the position for this moment in time (or the adjusted moment in time)
143 uint32 timeDiff = nextTimestamp - lastTimestamp;
144 uint32 interDiff = workDiff - lastTimestamp;
145 float xDiff = nextPosition.m_positionX - lastPosition.m_positionX;
146 float yDiff = nextPosition.m_positionY - lastPosition.m_positionY;
147 float zDiff = nextPosition.m_positionZ - lastPosition.m_positionZ;
148 Position interPosition(lastPosition.m_positionX + (xDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionY +
149 (yDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionZ + (zDiff * (float(interDiff) / float(timeDiff))));
150
151 // Advance _remoteSightPosition to new position
152 if (interPosition.IsPositionValid())
153 {
155 _remoteSightPosition.Relocate(interPosition);
157 }
158
159 // If we never received an end packet 10 seconds after the final timestamp then force an end
160 if (_cinematicDiff > _cinematicCamera->back().timeStamp + 10 * IN_MILLISECONDS)
161 EndCinematic();
162}
constexpr auto CINEMATIC_LOOKAHEAD
Definition CinematicMgr.h:27
constexpr auto IN_MILLISECONDS
Definition Common.h:53
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
void EndCinematic()
Definition CinematicMgr.cpp:65
Definition M2Stores.h:26
bool Passed()
Definition Timer.h:161
void Update(time_t diff)
Definition Timer.h:152
float m_positionZ
Definition Position.h:57
static float NormalizeOrientation(float o)
Definition Position.h:238
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56
float GetOrientation() const
Definition Position.h:124
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:191

References _activeCinematicCameraId, _cinematicCamera, _cinematicDiff, _cinematicUpdateTimer, _player, _remoteSightPosition, CINEMATIC_LOOKAHEAD, EndCinematic(), Position::GetAbsoluteAngle(), WorldObject::GetMap(), Position::GetOrientation(), IN_MILLISECONDS, Position::IsPositionValid(), Map::LoadGridsInRange(), Position::m_positionX, Position::m_positionY, Position::m_positionZ, MAX_VISIBILITY_DISTANCE, Position::NormalizeOrientation(), IntervalTimer::Passed(), Position::Relocate(), IntervalTimer::Reset(), IntervalTimer::Update(), and Player::UpdateVisibilityForPlayer().

Referenced by Player::Update().

Member Data Documentation

◆ _activeCinematicCameraId

uint32 CinematicMgr::_activeCinematicCameraId
private

◆ _cinematicCamera

std::vector<FlyByCamera> const* CinematicMgr::_cinematicCamera
private

◆ _cinematicDiff

uint32 CinematicMgr::_cinematicDiff
private

◆ _cinematicUpdateTimer

IntervalTimer CinematicMgr::_cinematicUpdateTimer
private

◆ _player

Player& CinematicMgr::_player
private

◆ _remoteSightPosition

Position CinematicMgr::_remoteSightPosition
private

The documentation for this class was generated from the following files: