TrinityCore
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 "Player.h"
25#include "TemporarySummon.h"
26
28{
29 player = playerref;
32 m_activeCinematic = nullptr;
35 m_cinematicCamera = nullptr;
36 m_remoteSightPosition = Position(0.0f, 0.0f, 0.0f);
37 m_CinematicObject = nullptr;
38}
39
41{
44}
45
47{
48 // Sanity check for active camera set
50 return;
51
53 if (!cinematicCameraId)
54 return;
55
56 if (std::vector<FlyByCamera> const* flyByCameras = GetFlyByCameras(cinematicCameraId))
57 {
58 // Initialize diff, and set camera
60 m_cinematicCamera = flyByCameras;
61
62 if (!m_cinematicCamera->empty())
63 {
64 FlyByCamera const& firstCamera = m_cinematicCamera->front();
65 Position const& pos = firstCamera.locations;
66 if (!pos.IsPositionValid())
67 return;
68
72 {
75 }
76
77 // Get cinematic length
78 m_cinematicLength = m_cinematicCamera->back().timeStamp;
79 }
80 }
81}
82
84{
86 return;
87
89 m_cinematicCamera = nullptr;
90 m_activeCinematic = nullptr;
93 {
94 if (WorldObject* vpObject = player->GetViewpoint())
95 if (vpObject == m_CinematicObject)
97
99 }
100}
101
103{
105 return;
106
107 Position lastPosition;
108 uint32 lastTimestamp = 0;
109 Position nextPosition;
110 uint32 nextTimestamp = 0;
111
112 // Obtain direction of travel
113 for (FlyByCamera const& cam : *m_cinematicCamera)
114 {
115 if (cam.timeStamp > m_cinematicDiff)
116 {
117 nextPosition.Relocate(cam.locations);
118 nextTimestamp = cam.timeStamp;
119 break;
120 }
121 lastPosition.Relocate(cam.locations);
122 lastTimestamp = cam.timeStamp;
123 }
124 float angle = lastPosition.GetAbsoluteAngle(&nextPosition);
125 angle -= lastPosition.GetOrientation();
126 if (angle < 0)
127 angle += 2 * float(M_PI);
128
129 // Look for position around 2 second ahead of us.
130 int32 workDiff = m_cinematicDiff;
131
132 // Modify result based on camera direction (Humans for example, have the camera point behind)
133 workDiff += static_cast<int32>(float(CINEMATIC_LOOKAHEAD) * cos(angle));
134
135 // Get an iterator to the last entry in the cameras, to make sure we don't go beyond the end
136 auto endItr = m_cinematicCamera->rbegin();
137 if (endItr != m_cinematicCamera->rend() && workDiff > static_cast<int32>(endItr->timeStamp))
138 workDiff = endItr->timeStamp;
139
140 // Never try to go back in time before the start of cinematic!
141 if (workDiff < 0)
142 workDiff = m_cinematicDiff;
143
144 // Obtain the previous and next waypoint based on timestamp
145 for (FlyByCamera const& cam : *m_cinematicCamera)
146 {
147 if (static_cast<int32>(cam.timeStamp) >= workDiff)
148 {
149 nextPosition.Relocate(cam.locations);
150 nextTimestamp = cam.timeStamp;
151 break;
152 }
153 lastPosition.Relocate(cam.locations);
154 lastTimestamp = cam.timeStamp;
155 }
156
157 // Never try to go beyond the end of the cinematic
158 if (workDiff > static_cast<int32>(nextTimestamp))
159 workDiff = static_cast<int32>(nextTimestamp);
160
161 // Interpolate the position for this moment in time (or the adjusted moment in time)
162 uint32 timeDiff = nextTimestamp - lastTimestamp;
163 uint32 interDiff = workDiff - lastTimestamp;
164 float xDiff = nextPosition.m_positionX - lastPosition.m_positionX;
165 float yDiff = nextPosition.m_positionY - lastPosition.m_positionY;
166 float zDiff = nextPosition.m_positionZ - lastPosition.m_positionZ;
167 Position interPosition(lastPosition.m_positionX + (xDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionY +
168 (yDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionZ + (zDiff * (float(interDiff) / float(timeDiff))));
169
170 // Advance (at speed) to this position. The remote sight object is used
171 // to send update information to player in cinematic
172 if (m_CinematicObject && interPosition.IsPositionValid())
173 m_CinematicObject->MonsterMoveWithSpeed(interPosition.m_positionX, interPosition.m_positionY, interPosition.m_positionZ, 500.0f, false, true);
174
175 // If we never received an end packet 10 seconds after the final timestamp then force an end
177 EndCinematic();
178}
#define CINEMATIC_LOOKAHEAD
Definition: CinematicMgr.h:24
@ IN_MILLISECONDS
Definition: Common.h:35
#define M_PI
Definition: Common.h:115
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::vector< FlyByCamera > const * GetFlyByCameras(uint32 cinematicCameraId)
Definition: M2Stores.cpp:267
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
#define VISUAL_WAYPOINT
Definition: Unit.h:35
Player * player
Definition: CinematicMgr.h:50
std::vector< FlyByCamera > const * m_cinematicCamera
Definition: CinematicMgr.h:58
CinematicSequencesEntry const * m_activeCinematic
Definition: CinematicMgr.h:55
uint32 m_cinematicDiff
Definition: CinematicMgr.h:53
uint32 m_lastCinematicCheck
Definition: CinematicMgr.h:54
uint32 m_cinematicLength
Definition: CinematicMgr.h:57
int32 m_activeCinematicCameraIndex
Definition: CinematicMgr.h:56
void EndCinematic()
CinematicMgr(Player *playerref)
TempSummon * m_CinematicObject
Definition: CinematicMgr.h:60
void NextCinematicCamera()
Position m_remoteSightPosition
Definition: CinematicMgr.h:59
void UpdateCinematicLocation(uint32 diff)
void LoadGridForActiveObject(float x, float y, WorldObject const *object)
Definition: Map.cpp:410
void SetViewpoint(WorldObject *target, bool apply)
Definition: Player.cpp:26139
WorldObject * GetViewpoint() const
Definition: Player.cpp:26184
void MonsterMoveWithSpeed(float x, float y, float z, float speed, bool generatePath=false, bool forceDestination=false)
Definition: Unit.cpp:506
Map * GetMap() const
Definition: Object.h:624
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:2025
void setActive(bool isActiveObject)
Definition: Object.cpp:922
void AddObjectToRemoveList()
Definition: Object.cpp:1824
constexpr std::size_t size()
Definition: UpdateField.h:796
std::array< uint16, 8 > Camera
Definition: DB2Structure.h:895
Position locations
Definition: M2Stores.h:28
constexpr float GetPositionX() const
Definition: Position.h:76
float m_positionZ
Definition: Position.h:55
constexpr float GetPositionY() const
Definition: Position.h:77
float m_positionX
Definition: Position.h:53
float m_positionY
Definition: Position.h:54
float GetAbsoluteAngle(float x, float y) const
Definition: Position.h:125
bool IsPositionValid() const
Definition: Position.cpp:42
constexpr void Relocate(float x, float y)
Definition: Position.h:63
constexpr float GetOrientation() const
Definition: Position.h:79