mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-02-03 15:47:04 +01:00
Core/Players: Fixed initial cinematic camera getting stuck
Closes #24258
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*/)
|
||||
|
||||
Reference in New Issue
Block a user