TrinityCore
SceneMgr.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 "SceneMgr.h"
19#include "Chat.h"
20#include "DB2Stores.h"
21#include "Language.h"
22#include "ObjectMgr.h"
23#include "Player.h"
24#include "ScenePackets.h"
25#include "ScriptMgr.h"
26#include "SpellAuraEffects.h"
27
28SceneMgr::SceneMgr(Player* player) : _player(player)
29{
31 _isDebuggingScenes = false;
32}
33
34SceneMgr::~SceneMgr() = default;
35
36uint32 SceneMgr::PlayScene(uint32 sceneId, Position const* position /*= nullptr*/)
37{
38 SceneTemplate const* sceneTemplate = sObjectMgr->GetSceneTemplate(sceneId);
39 return PlaySceneByTemplate(sceneTemplate, position);
40}
41
42uint32 SceneMgr::PlaySceneByTemplate(SceneTemplate const* sceneTemplate, Position const* position /*= nullptr*/)
43{
44 if (!sceneTemplate)
45 return 0;
46
47 SceneScriptPackageEntry const* entry = sSceneScriptPackageStore.LookupEntry(sceneTemplate->ScenePackageId);
48 if (!entry)
49 return 0;
50
51 // By default, take player position
52 if (!position)
53 position = GetPlayer();
54
55 uint32 sceneInstanceID = GetNewStandaloneSceneInstanceID();
56
58 ChatHandler(GetPlayer()->GetSession()).PSendSysMessage(LANG_COMMAND_SCENE_DEBUG_PLAY, sceneInstanceID, sceneTemplate->ScenePackageId, sceneTemplate->PlaybackFlags.AsUnderlyingType());
59
61 playScene.SceneID = sceneTemplate->SceneId;
62 playScene.PlaybackFlags = sceneTemplate->PlaybackFlags.AsUnderlyingType();
63 playScene.SceneInstanceID = sceneInstanceID;
64 playScene.SceneScriptPackageID = sceneTemplate->ScenePackageId;
65 playScene.Location = *position;
66 if (!GetPlayer()->GetVehicle()) // skip vehicles passed as transport here until further research
67 playScene.TransportGUID = GetPlayer()->GetTransGUID();
68 playScene.Encrypted = sceneTemplate->Encrypted;
69 playScene.Write();
70
71 if (GetPlayer()->IsInWorld())
73 else
74 _delayedScenes.push_back(playScene.Move());
75
76 AddInstanceIdToSceneMap(sceneInstanceID, sceneTemplate);
77
78 sScriptMgr->OnSceneStart(GetPlayer(), sceneInstanceID, sceneTemplate);
79
80 return sceneInstanceID;
81}
82
83uint32 SceneMgr::PlaySceneByPackageId(uint32 sceneScriptPackageId, EnumFlag<SceneFlag> playbackflags /*= SCENEFLAG_UNK16*/, Position const* position /*= nullptr*/)
84{
85 SceneTemplate sceneTemplate;
86 sceneTemplate.SceneId = 0;
87 sceneTemplate.ScenePackageId = sceneScriptPackageId;
88 sceneTemplate.PlaybackFlags = playbackflags;
89 sceneTemplate.Encrypted = false;
90 sceneTemplate.ScriptId = 0;
91
92 return PlaySceneByTemplate(&sceneTemplate, position);
93}
94
95void SceneMgr::CancelScene(uint32 sceneInstanceID, bool removeFromMap /*= true*/)
96{
97 if (removeFromMap)
98 RemoveSceneInstanceId(sceneInstanceID);
99
101 cancelScene.SceneInstanceID = sceneInstanceID;
102 GetPlayer()->SendDirectMessage(cancelScene.Write());
103}
104
105void SceneMgr::OnSceneTrigger(uint32 sceneInstanceID, std::string const& triggerName)
106{
107 if (!HasScene(sceneInstanceID))
108 return;
109
111 ChatHandler(GetPlayer()->GetSession()).PSendSysMessage(LANG_COMMAND_SCENE_DEBUG_TRIGGER, sceneInstanceID, triggerName.c_str());
112
113 SceneTemplate const* sceneTemplate = GetSceneTemplateFromInstanceId(sceneInstanceID);
114 sScriptMgr->OnSceneTrigger(GetPlayer(), sceneInstanceID, sceneTemplate, triggerName);
115}
116
117void SceneMgr::OnSceneCancel(uint32 sceneInstanceID)
118{
119 if (!HasScene(sceneInstanceID))
120 return;
121
123 ChatHandler(GetPlayer()->GetSession()).PSendSysMessage(LANG_COMMAND_SCENE_DEBUG_CANCEL, sceneInstanceID);
124
125 SceneTemplate sceneTemplate = *GetSceneTemplateFromInstanceId(sceneInstanceID);
127 return;
128
129 // Must be done before removing aura
130 RemoveSceneInstanceId(sceneInstanceID);
131
132 if (sceneTemplate.SceneId != 0)
133 RemoveAurasDueToSceneId(sceneTemplate.SceneId);
134
135 sScriptMgr->OnSceneCancel(GetPlayer(), sceneInstanceID, &sceneTemplate);
136
138 CancelScene(sceneInstanceID, false);
139}
140
142{
143 if (!HasScene(sceneInstanceID))
144 return;
145
148
149 SceneTemplate sceneTemplate = *GetSceneTemplateFromInstanceId(sceneInstanceID);
150
151 // Must be done before removing aura
152 RemoveSceneInstanceId(sceneInstanceID);
153
154 if (sceneTemplate.SceneId != 0)
155 RemoveAurasDueToSceneId(sceneTemplate.SceneId);
156
157 sScriptMgr->OnSceneComplete(GetPlayer(), sceneInstanceID, &sceneTemplate);
158
160 CancelScene(sceneInstanceID, false);
161}
162
163bool SceneMgr::HasScene(uint32 sceneInstanceID, uint32 sceneScriptPackageId /*= 0*/) const
164{
165 auto itr = _scenesByInstance.find(sceneInstanceID);
166
167 if (itr != _scenesByInstance.end())
168 return !sceneScriptPackageId || sceneScriptPackageId == itr->second->ScenePackageId;
169
170 return false;
171}
172
173void SceneMgr::AddInstanceIdToSceneMap(uint32 sceneInstanceID, SceneTemplate const* sceneTemplate)
174{
175 _scenesByInstance[sceneInstanceID] = std::make_unique<SceneTemplate>(*sceneTemplate);
176}
177
179{
180 std::vector<uint32> instancesIds;
181
182 for (auto const& itr : _scenesByInstance)
183 if (itr.second->SceneId == sceneId)
184 instancesIds.push_back(itr.first);
185
186 for (uint32 sceneInstanceID : instancesIds)
187 CancelScene(sceneInstanceID);
188}
189
190void SceneMgr::CancelSceneByPackageId(uint32 sceneScriptPackageId)
191{
192 std::vector<uint32> instancesIds;
193
194 for (auto const& itr : _scenesByInstance)
195 if (itr.second->ScenePackageId == sceneScriptPackageId)
196 instancesIds.push_back(itr.first);
197
198 for (uint32 sceneInstanceID : instancesIds)
199 CancelScene(sceneInstanceID);
200}
201
203{
204 _scenesByInstance.erase(sceneInstanceID);
205}
206
208{
210 for (AuraEffect* scenePlayAura : scenePlayAuras)
211 {
212 if (uint32(scenePlayAura->GetMiscValue()) == sceneId)
213 {
214 GetPlayer()->RemoveAura(scenePlayAura->GetBase());
215 break;
216 }
217 }
218}
219
221{
222 auto itr = _scenesByInstance.find(sceneInstanceID);
223
224 if (itr != _scenesByInstance.end())
225 return itr->second.get();
226
227 return nullptr;
228}
229
230uint32 SceneMgr::GetActiveSceneCount(uint32 sceneScriptPackageId /*= 0*/) const
231{
232 uint32 activeSceneCount = 0;
233
234 for (auto const& itr : _scenesByInstance)
235 if (!sceneScriptPackageId || itr.second->ScenePackageId == sceneScriptPackageId)
236 ++activeSceneCount;
237
238 return activeSceneCount;
239}
240
242{
243 for (WorldPacket& playScene : _delayedScenes)
244 GetPlayer()->SendDirectMessage(&playScene);
245
246 _delayedScenes.clear();
247}
DB2Storage< SceneScriptPackageEntry > sSceneScriptPackageStore("SceneScriptPackage.db2", &SceneScriptPackageLoadInfo::Instance)
uint32_t uint32
Definition: Define.h:142
@ LANG_COMMAND_SCENE_DEBUG_CANCEL
Definition: Language.h:1128
@ LANG_COMMAND_SCENE_DEBUG_TRIGGER
Definition: Language.h:1127
@ LANG_COMMAND_SCENE_DEBUG_PLAY
Definition: Language.h:1126
@ LANG_COMMAND_SCENE_DEBUG_COMPLETE
Definition: Language.h:1129
#define sObjectMgr
Definition: ObjectMgr.h:1946
@ FadeToBlackscreenOnComplete
@ FadeToBlackscreenOnCancel
#define sScriptMgr
Definition: ScriptMgr.h:1418
@ SPELL_AURA_PLAY_SCENE
void PSendSysMessage(const char *fmt, Args &&... args)
Definition: Chat.h:57
constexpr bool HasFlag(T flag) const
Definition: EnumFlag.h:106
constexpr std::underlying_type_t< T > AsUnderlyingType() const
Definition: EnumFlag.h:122
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
void CancelSceneByPackageId(uint32 sceneScriptPackageId)
Definition: SceneMgr.cpp:190
void CancelSceneBySceneId(uint32 sceneId)
Definition: SceneMgr.cpp:178
void RemoveSceneInstanceId(uint32 sceneInstanceID)
Definition: SceneMgr.cpp:202
void OnSceneCancel(uint32 sceneInstanceID)
Definition: SceneMgr.cpp:117
bool HasScene(uint32 sceneInstanceID, uint32 sceneScriptPackageId=0) const
Definition: SceneMgr.cpp:163
uint32 PlaySceneByTemplate(SceneTemplate const *sceneTemplate, Position const *position=nullptr)
Definition: SceneMgr.cpp:42
uint32 PlaySceneByPackageId(uint32 sceneScriptPackageId, EnumFlag< SceneFlag > playbackflags, Position const *position=nullptr)
Definition: SceneMgr.cpp:83
uint32 GetNewStandaloneSceneInstanceID()
Definition: SceneMgr.h:72
uint32 GetActiveSceneCount(uint32 sceneScriptPackageId=0) const
Definition: SceneMgr.cpp:230
SceneTemplate const * GetSceneTemplateFromInstanceId(uint32 sceneInstanceID) const
Definition: SceneMgr.cpp:220
std::vector< WorldPacket > _delayedScenes
Definition: SceneMgr.h:83
void AddInstanceIdToSceneMap(uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
Definition: SceneMgr.cpp:173
void OnSceneTrigger(uint32 sceneInstanceID, std::string const &triggerName)
Definition: SceneMgr.cpp:105
uint32 _standaloneSceneInstanceID
Definition: SceneMgr.h:82
void TriggerDelayedScenes()
Definition: SceneMgr.cpp:241
SceneMgr(Player *player)
Definition: SceneMgr.cpp:28
void RemoveAurasDueToSceneId(uint32 sceneId)
Definition: SceneMgr.cpp:207
void OnSceneComplete(uint32 sceneInstanceID)
Definition: SceneMgr.cpp:141
void CancelScene(uint32 sceneInstanceID, bool removeFromMap=true)
Definition: SceneMgr.cpp:95
SceneTemplateByInstance _scenesByInstance
Definition: SceneMgr.h:81
Player * GetPlayer() const
Definition: SceneMgr.h:43
bool _isDebuggingScenes
Definition: SceneMgr.h:84
uint32 PlayScene(uint32 sceneId, Position const *position=nullptr)
Definition: SceneMgr.cpp:36
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1321
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3685
std::forward_list< AuraEffect * > AuraEffectList
Definition: Unit.h:644
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:11510
WorldPacket const * GetRawPacket() const
Definition: Packet.h:38
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket && Move()
Definition: Packet.h:54
uint32 SceneId
Definition: ObjectMgr.h:854
EnumFlag< SceneFlag > PlaybackFlags
Definition: ObjectMgr.h:855
uint32 ScriptId
Definition: ObjectMgr.h:858
uint32 ScenePackageId
Definition: ObjectMgr.h:856
bool Encrypted
Definition: ObjectMgr.h:857