TrinityCore
Loading...
Searching...
No Matches
CinematicMgr.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "CinematicMgr.h"
19#include "Containers.h"
20#include "DB2Structure.h"
21#include "M2Stores.h"
22#include "Map.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "Player.h"
26#include "TemporarySummon.h"
27
40
46
48{
49 // Sanity check for active camera set
51 return;
52
54 if (!cinematicCameraId)
55 return;
56
57 CinematicSequencesEntry const* activeCinematic = m_activeCinematic;
59
62
63 m_activeCinematic = activeCinematic;
64 m_activeCinematicCameraIndex = activeCamera;
65
66 if (std::vector<FlyByCamera> const* flyByCameras = GetFlyByCameras(cinematicCameraId))
67 {
68 // Initialize diff, and set camera
70 m_cinematicCamera = flyByCameras;
71
72 if (!m_cinematicCamera->empty())
73 {
74 FlyByCamera const& firstCamera = m_cinematicCamera->front();
75 Position const& pos = firstCamera.locations;
76 if (!pos.IsPositionValid())
77 return;
78
81 {
82 m_CinematicObjectGUID = cinematicObject->GetGUID();
83 cinematicObject->setActive(true);
84 player->SetViewpoint(cinematicObject, true);
85 }
86
87 // Get cinematic length
88 m_cinematicLength = m_cinematicCamera->back().timeStamp;
89 }
90 }
91}
92
94{
96 return;
97
99 m_cinematicCamera = nullptr;
100 m_activeCinematic = nullptr;
103 {
104 if (WorldObject* vpObject = player->GetViewpoint())
105 if (vpObject->GetGUID() == m_CinematicObjectGUID)
106 player->SetViewpoint(vpObject, false);
107
109 cinematicObject->AddObjectToRemoveList();
110
112 }
113}
114
116{
118 return;
119
120 Position lastPosition;
121 uint32 lastTimestamp = 0;
122 Position nextPosition;
123 uint32 nextTimestamp = 0;
124
125 // Obtain direction of travel
126 for (FlyByCamera const& cam : *m_cinematicCamera)
127 {
128 if (cam.timeStamp > m_cinematicDiff)
129 {
130 nextPosition.Relocate(cam.locations);
131 nextTimestamp = cam.timeStamp;
132 break;
133 }
134 lastPosition.Relocate(cam.locations);
135 lastTimestamp = cam.timeStamp;
136 }
137 float angle = lastPosition.GetAbsoluteAngle(&nextPosition);
138 angle -= lastPosition.GetOrientation();
139 if (angle < 0)
140 angle += 2 * float(M_PI);
141
142 // Look for position around 2 second ahead of us.
143 int32 workDiff = m_cinematicDiff;
144
145 // Modify result based on camera direction (Humans for example, have the camera point behind)
146 workDiff += static_cast<int32>(float(CINEMATIC_LOOKAHEAD) * cos(angle));
147
148 // Get an iterator to the last entry in the cameras, to make sure we don't go beyond the end
149 auto endItr = m_cinematicCamera->rbegin();
150 if (endItr != m_cinematicCamera->rend() && workDiff > static_cast<int32>(endItr->timeStamp))
151 workDiff = endItr->timeStamp;
152
153 // Never try to go back in time before the start of cinematic!
154 if (workDiff < 0)
155 workDiff = m_cinematicDiff;
156
157 // Obtain the previous and next waypoint based on timestamp
158 for (FlyByCamera const& cam : *m_cinematicCamera)
159 {
160 if (static_cast<int32>(cam.timeStamp) >= workDiff)
161 {
162 nextPosition.Relocate(cam.locations);
163 nextTimestamp = cam.timeStamp;
164 break;
165 }
166 lastPosition.Relocate(cam.locations);
167 lastTimestamp = cam.timeStamp;
168 }
169
170 // Never try to go beyond the end of the cinematic
171 if (workDiff > static_cast<int32>(nextTimestamp))
172 workDiff = static_cast<int32>(nextTimestamp);
173
174 // Interpolate the position for this moment in time (or the adjusted moment in time)
175 uint32 timeDiff = nextTimestamp - lastTimestamp;
176 uint32 interDiff = workDiff - lastTimestamp;
177 float xDiff = nextPosition.m_positionX - lastPosition.m_positionX;
178 float yDiff = nextPosition.m_positionY - lastPosition.m_positionY;
179 float zDiff = nextPosition.m_positionZ - lastPosition.m_positionZ;
180 Position interPosition(lastPosition.m_positionX + (xDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionY +
181 (yDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionZ + (zDiff * (float(interDiff) / float(timeDiff))));
182
183 WorldObject* vpObject = player ? player->GetViewpoint() : nullptr;
184 if (!vpObject || vpObject->GetGUID() != m_CinematicObjectGUID)
185 {
186 EndCinematic();
187 return;
188 }
189
190 // Advance (at speed) to this position. The remote sight object is used
191 // to send update information to player in cinematic
192 if (vpObject->IsCreature() && interPosition.IsPositionValid())
193 vpObject->ToCreature()->MonsterMoveWithSpeed(interPosition.m_positionX, interPosition.m_positionY, interPosition.m_positionZ, 500.0f, false, true);
194
195 // If we never received an end packet 10 seconds after the final timestamp then force an end
197 EndCinematic();
198}
#define CINEMATIC_LOOKAHEAD
@ IN_MILLISECONDS
Definition Common.h:38
#define M_PI
Definition Common.h:118
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::vector< FlyByCamera > const * GetFlyByCameras(uint32 cinematicCameraId)
Definition M2Stores.cpp:266
@ TEMPSUMMON_TIMED_DESPAWN
#define VISUAL_WAYPOINT
Definition Unit.h:35
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsCreature() const
Definition BaseEntity.h:172
Player * player
std::vector< FlyByCamera > const * m_cinematicCamera
CinematicSequencesEntry const * m_activeCinematic
uint32 m_cinematicDiff
uint32 m_lastCinematicCheck
uint32 m_cinematicLength
int32 m_activeCinematicCameraIndex
void EndCinematic()
CinematicMgr(Player *playerref)
ObjectGuid m_CinematicObjectGUID
void NextCinematicCamera()
Position m_remoteSightPosition
void UpdateCinematicLocation(uint32 diff)
void LoadGridForActiveObject(float x, float y, WorldObject const *object)
Definition Map.cpp:375
static ObjectGuid const Empty
Definition ObjectGuid.h:314
bool IsEmpty() const
Definition ObjectGuid.h:362
void Clear()
Definition ObjectGuid.h:329
Creature * ToCreature()
Definition Object.h:121
void SetViewpoint(WorldObject *target, bool apply)
Definition Player.cpp:26877
WorldObject * GetViewpoint() const
Definition Player.cpp:26922
void MonsterMoveWithSpeed(float x, float y, float z, float speed, bool generatePath=false, bool forceDestination=false)
Definition Unit.cpp:538
Map * GetMap() const
Definition Object.h:411
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1403
TC_GAME_API WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const &)
std::array< uint16, 8 > Camera
Position locations
Definition M2Stores.h:28
constexpr float GetPositionX() const
Definition Position.h:87
float m_positionZ
Definition Position.h:66
constexpr float GetPositionY() const
Definition Position.h:88
float m_positionX
Definition Position.h:64
float m_positionY
Definition Position.h:65
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:136
bool IsPositionValid() const
Definition Position.cpp:42
constexpr void Relocate(float x, float y)
Definition Position.h:74
constexpr float GetOrientation() const
Definition Position.h:90