diff --git a/src/server/game/Entities/Player/SceneDefines.h b/src/server/game/Entities/Player/SceneDefines.h
new file mode 100644
index 00000000000..cc02301a4c5
--- /dev/null
+++ b/src/server/game/Entities/Player/SceneDefines.h
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#ifndef SceneDefines_h__
+#define SceneDefines_h__
+
+#include "Define.h"
+#include "EnumFlag.h"
+
+enum class SceneFlag : uint32
+{
+ None = 0x00,
+ PlayerNonInteractablePhased = 0x01, // Sets UNIT_FLAG_IMMUNE_TO_PC + UNIT_FLAG_IMMUNE_TO_NPC + UNIT_FLAG_PACIFIED
+ FadeToBlackscreenOnComplete = 0x02,
+ NotCancelable = 0x04,
+ FadeToBlackscreenOnCancel = 0x08,
+
+ IgnoreTransport = 0x20
+};
+
+DEFINE_ENUM_FLAG(SceneFlag);
+
+#endif // SceneDefines_h__
diff --git a/src/server/game/Entities/Player/SceneMgr.cpp b/src/server/game/Entities/Player/SceneMgr.cpp
index 342b4e6cbb2..d44182fb9eb 100644
--- a/src/server/game/Entities/Player/SceneMgr.cpp
+++ b/src/server/game/Entities/Player/SceneMgr.cpp
@@ -55,11 +55,11 @@ uint32 SceneMgr::PlaySceneByTemplate(SceneTemplate const* sceneTemplate, Positio
uint32 sceneInstanceID = GetNewStandaloneSceneInstanceID();
if (_isDebuggingScenes)
- ChatHandler(GetPlayer()->GetSession()).PSendSysMessage(LANG_COMMAND_SCENE_DEBUG_PLAY, sceneInstanceID, sceneTemplate->ScenePackageId, sceneTemplate->PlaybackFlags);
+ ChatHandler(GetPlayer()->GetSession()).PSendSysMessage(LANG_COMMAND_SCENE_DEBUG_PLAY, sceneInstanceID, sceneTemplate->ScenePackageId, sceneTemplate->PlaybackFlags.AsUnderlyingType());
WorldPackets::Scenes::PlayScene playScene;
playScene.SceneID = sceneTemplate->SceneId;
- playScene.PlaybackFlags = sceneTemplate->PlaybackFlags;
+ playScene.PlaybackFlags = sceneTemplate->PlaybackFlags.AsUnderlyingType();
playScene.SceneInstanceID = sceneInstanceID;
playScene.SceneScriptPackageID = sceneTemplate->ScenePackageId;
playScene.Location = *position;
@@ -79,7 +79,7 @@ uint32 SceneMgr::PlaySceneByTemplate(SceneTemplate const* sceneTemplate, Positio
return sceneInstanceID;
}
-uint32 SceneMgr::PlaySceneByPackageId(uint32 sceneScriptPackageId, uint32 playbackflags /*= SCENEFLAG_UNK16*/, Position const* position /*= nullptr*/)
+uint32 SceneMgr::PlaySceneByPackageId(uint32 sceneScriptPackageId, EnumFlag playbackflags /*= SCENEFLAG_UNK16*/, Position const* position /*= nullptr*/)
{
SceneTemplate sceneTemplate;
sceneTemplate.SceneId = 0;
@@ -122,6 +122,8 @@ void SceneMgr::OnSceneCancel(uint32 sceneInstanceID)
ChatHandler(GetPlayer()->GetSession()).PSendSysMessage(LANG_COMMAND_SCENE_DEBUG_CANCEL, sceneInstanceID);
SceneTemplate const* sceneTemplate = GetSceneTemplateFromInstanceId(sceneInstanceID);
+ if (sceneTemplate->PlaybackFlags.HasFlag(SceneFlag::NotCancelable))
+ return;
// Must be done before removing aura
RemoveSceneInstanceId(sceneInstanceID);
@@ -131,7 +133,7 @@ void SceneMgr::OnSceneCancel(uint32 sceneInstanceID)
sScriptMgr->OnSceneCancel(GetPlayer(), sceneInstanceID, sceneTemplate);
- if (sceneTemplate->PlaybackFlags & SCENEFLAG_CANCEL_AT_END)
+ if (sceneTemplate->PlaybackFlags.HasFlag(SceneFlag::FadeToBlackscreenOnCancel))
CancelScene(sceneInstanceID, false);
}
@@ -153,7 +155,7 @@ void SceneMgr::OnSceneComplete(uint32 sceneInstanceID)
sScriptMgr->OnSceneComplete(GetPlayer(), sceneInstanceID, sceneTemplate);
- if (sceneTemplate->PlaybackFlags & SCENEFLAG_CANCEL_AT_END)
+ if (sceneTemplate->PlaybackFlags.HasFlag(SceneFlag::FadeToBlackscreenOnComplete))
CancelScene(sceneInstanceID, false);
}
diff --git a/src/server/game/Entities/Player/SceneMgr.h b/src/server/game/Entities/Player/SceneMgr.h
index add721b4931..4cb6db547fb 100644
--- a/src/server/game/Entities/Player/SceneMgr.h
+++ b/src/server/game/Entities/Player/SceneMgr.h
@@ -19,19 +19,10 @@
#define SceneMgr_h__
#include "Common.h"
+#include "SceneDefines.h"
#include