Core/Players: Fixed initial cinematic camera getting stuck

Closes #24258
This commit is contained in:
Shauren
2020-03-27 21:44:19 +01:00
parent 0969e93d15
commit 0913858328
4 changed files with 27 additions and 15 deletions

View File

@@ -16,6 +16,7 @@
*/
#include "CinematicMgr.h"
#include "Containers.h"
#include "M2Stores.h"
#include "Map.h"
#include "MotionMaster.h"
@@ -27,7 +28,8 @@ CinematicMgr::CinematicMgr(Player* playerref)
player = playerref;
m_cinematicDiff = 0;
m_lastCinematicCheck = 0;
m_activeCinematicCameraId = 0;
m_activeCinematic = nullptr;
m_activeCinematicCameraIndex = -1;
m_cinematicLength = 0;
m_cinematicCamera = nullptr;
m_remoteSightPosition = Position(0.0f, 0.0f, 0.0f);
@@ -36,17 +38,21 @@ CinematicMgr::CinematicMgr(Player* playerref)
CinematicMgr::~CinematicMgr()
{
if (m_cinematicCamera && m_activeCinematicCameraId)
if (m_cinematicCamera && m_activeCinematic)
EndCinematic();
}
void CinematicMgr::BeginCinematic()
void CinematicMgr::NextCinematicCamera()
{
// Sanity check for active camera set
if (m_activeCinematicCameraId == 0)
if (!m_activeCinematic || m_activeCinematicCameraIndex >= int32(Trinity::Containers::Size(m_activeCinematic->Camera)))
return;
if (std::vector<FlyByCamera> const* flyByCameras = GetFlyByCameras(m_activeCinematicCameraId))
uint32 cinematicCameraId = m_activeCinematic->Camera[++m_activeCinematicCameraIndex];
if (!cinematicCameraId)
return;
if (std::vector<FlyByCamera> const* flyByCameras = GetFlyByCameras(cinematicCameraId))
{
// Initialize diff, and set camera
m_cinematicDiff = 0;
@@ -75,12 +81,13 @@ void CinematicMgr::BeginCinematic()
void CinematicMgr::EndCinematic()
{
if (m_activeCinematicCameraId == 0)
if (!m_activeCinematic)
return;
m_cinematicDiff = 0;
m_cinematicCamera = nullptr;
m_activeCinematicCameraId = 0;
m_activeCinematic = nullptr;
m_activeCinematicCameraIndex = -1;
if (m_CinematicObject)
{
if (WorldObject* vpObject = player->GetViewpoint())
@@ -93,7 +100,7 @@ void CinematicMgr::EndCinematic()
void CinematicMgr::UpdateCinematicLocation(uint32 /*diff*/)
{
if (m_activeCinematicCameraId == 0 || !m_cinematicCamera || m_cinematicCamera->size() == 0)
if (!m_activeCinematic || m_activeCinematicCameraIndex == -1 || !m_cinematicCamera || m_cinematicCamera->size() == 0)
return;
Position lastPosition;

View File

@@ -25,6 +25,7 @@
#define CINEMATIC_UPDATEDIFF 500
class Player;
struct CinematicSequencesEntry;
struct FlyByCamera;
class TC_GAME_API CinematicMgr
@@ -34,10 +35,13 @@ public:
explicit CinematicMgr(Player* playerref);
~CinematicMgr();
// Cinematic camera data and remote sight functions
uint32 GetActiveCinematicCamera() const { return m_activeCinematicCameraId; }
void SetActiveCinematicCamera(uint32 cinematicCameraId = 0) { m_activeCinematicCameraId = cinematicCameraId; }
bool IsOnCinematic() const { return (m_cinematicCamera != nullptr); }
void BeginCinematic();
void BeginCinematic(CinematicSequencesEntry const* cinematic)
{
m_activeCinematic = cinematic;
m_activeCinematicCameraIndex = -1;
}
void NextCinematicCamera();
void EndCinematic();
void UpdateCinematicLocation(uint32 diff);
@@ -48,7 +52,8 @@ private:
protected:
uint32 m_cinematicDiff;
uint32 m_lastCinematicCheck;
uint32 m_activeCinematicCameraId;
CinematicSequencesEntry const* m_activeCinematic;
int32 m_activeCinematicCameraIndex;
uint32 m_cinematicLength;
std::vector<FlyByCamera> const* m_cinematicCamera;
Position m_remoteSightPosition;

View File

@@ -1035,7 +1035,7 @@ void Player::Update(uint32 p_time)
// Update cinematic location, if 500ms have passed and we're doing a cinematic now.
_cinematicMgr->m_cinematicDiff += p_time;
if (_cinematicMgr->m_activeCinematicCameraId != 0 && GetMSTimeDiffToNow(_cinematicMgr->m_lastCinematicCheck) > CINEMATIC_UPDATEDIFF)
if (_cinematicMgr->m_activeCinematicCameraIndex != 0 && GetMSTimeDiffToNow(_cinematicMgr->m_lastCinematicCheck) > CINEMATIC_UPDATEDIFF)
{
_cinematicMgr->m_lastCinematicCheck = GameTime::GetGameTimeMS();
_cinematicMgr->UpdateCinematicLocation(p_time);
@@ -6047,7 +6047,7 @@ void Player::SendCinematicStart(uint32 CinematicSequenceId) const
packet.CinematicID = CinematicSequenceId;
SendDirectMessage(packet.Write());
if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
_cinematicMgr->SetActiveCinematicCamera(sequence->Camera[0]);
_cinematicMgr->BeginCinematic(sequence);
}
void Player::SendMovieStart(uint32 movieId)

View File

@@ -717,7 +717,7 @@ void WorldSession::HandleCompleteCinematic(WorldPackets::Misc::CompleteCinematic
void WorldSession::HandleNextCinematicCamera(WorldPackets::Misc::NextCinematicCamera& /*packet*/)
{
// Sent by client when cinematic actually begun. So we begin the server side process
GetPlayer()->GetCinematicMgr()->BeginCinematic();
GetPlayer()->GetCinematicMgr()->NextCinematicCamera();
}
void WorldSession::HandleCompleteMovie(WorldPackets::Misc::CompleteMovie& /*packet*/)