TrinityCore
Loading...
Searching...
No Matches
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 (auto const& itr : _scenesByInstance)
244 {
245 if (itr.second->SceneId == sceneId)
246 return itr.first;
247 }
248 return std::nullopt;
249}
250
252{
253 for (WorldPacket& playScene : _delayedScenes)
254 GetPlayer()->SendDirectMessage(&playScene);
255
256 _delayedScenes.clear();
257}
DB2Storage< SceneScriptPackageEntry > sSceneScriptPackageStore("SceneScriptPackage.db2", &SceneScriptPackageLoadInfo::Instance)
uint32_t uint32
Definition Define.h:154
@ LANG_COMMAND_SCENE_DEBUG_CANCEL
Definition Language.h:1137
@ LANG_COMMAND_SCENE_DEBUG_TRIGGER
Definition Language.h:1136
@ LANG_COMMAND_SCENE_DEBUG_PLAY
Definition Language.h:1135
@ LANG_COMMAND_SCENE_DEBUG_COMPLETE
Definition Language.h:1138
#define sObjectMgr
Definition ObjectMgr.h:1885
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
@ FadeToBlackscreenOnComplete
@ FadeToBlackscreenOnCancel
#define sScriptMgr
Definition ScriptMgr.h:1449
@ SPELL_AURA_PLAY_SCENE
void PSendSysMessage(char const *fmt, Args &&... args)
Definition Chat.h:62
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:6283
void CancelSceneByPackageId(uint32 sceneScriptPackageId)
Definition SceneMgr.cpp:190
void CancelSceneBySceneId(uint32 sceneId)
Definition SceneMgr.cpp:178
Optional< uint32 > GetInstanceIdBySceneId(uint32 sceneId) const
Definition SceneMgr.cpp:241
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:74
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:85
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:84
void TriggerDelayedScenes()
Definition SceneMgr.cpp:251
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:83
Player * GetPlayer() const
Definition SceneMgr.h:44
bool _isDebuggingScenes
Definition SceneMgr.h:86
uint32 PlayScene(uint32 sceneId, Position const *position=nullptr)
Definition SceneMgr.cpp:36
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1342
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3828
std::forward_list< AuraEffect * > AuraEffectList
Definition Unit.h:652
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:12141
WorldPacket const * GetRawPacket() const
Definition Packet.h:38
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZO > Location
WorldPacket && Move()
Definition Packet.h:54
uint32 SceneId
Definition ObjectMgr.h:856
EnumFlag< SceneFlag > PlaybackFlags
Definition ObjectMgr.h:857
uint32 ScriptId
Definition ObjectMgr.h:860
uint32 ScenePackageId
Definition ObjectMgr.h:858