aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp17
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Player/SceneMgr.cpp16
-rw-r--r--src/server/game/Entities/Player/SceneMgr.h6
5 files changed, 33 insertions, 9 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 5eac3047a38..a38b488bee6 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -732,21 +732,22 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
if (flags.ActivePlayer)
{
- bool HasSceneInstanceIDs = false;
+ Player const* player = ToPlayer();
+
+ bool HasSceneInstanceIDs = !player->GetSceneMgr().GetSceneTemplateByInstanceMap().empty();
bool HasRuneState = ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS;
data->WriteBit(HasSceneInstanceIDs);
data->WriteBit(HasRuneState);
data->FlushBits();
- //if (HasSceneInstanceIDs)
- //{
- // *data << uint32(SceneInstanceIDs.size());
- // for (std::size_t i = 0; i < SceneInstanceIDs.size(); ++i)
- // *data << uint32(SceneInstanceIDs[i]);
- //}
+ if (HasSceneInstanceIDs)
+ {
+ *data << uint32(player->GetSceneMgr().GetSceneTemplateByInstanceMap().size());
+ for (auto const& itr : player->GetSceneMgr().GetSceneTemplateByInstanceMap())
+ *data << uint32(itr.first);
+ }
if (HasRuneState)
{
- Player const* player = ToPlayer();
float baseCd = float(player->GetRuneBaseCooldown());
uint32 maxRunes = uint32(player->GetMaxPower(POWER_RUNES));
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 6815dbfeedf..78b10322eda 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -24377,6 +24377,8 @@ void Player::SendInitialPacketsAfterAddToMap()
else
ClearQuestSharingInfo();
}
+
+ GetSceneMgr().TriggerDelayedScenes();
}
void Player::SendUpdateToOutOfRangeGroupMembers()
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 99660ed918c..5299adbeb65 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2556,6 +2556,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SetAdvancedCombatLogging(bool enabled) { _advancedCombatLoggingEnabled = enabled; }
SceneMgr& GetSceneMgr() { return m_sceneMgr; }
+ SceneMgr const& GetSceneMgr() const { return m_sceneMgr; }
RestMgr& GetRestMgr() const { return *_restMgr; }
void SetRestState(RestTypes type, PlayerRestState state)
{
diff --git a/src/server/game/Entities/Player/SceneMgr.cpp b/src/server/game/Entities/Player/SceneMgr.cpp
index 9d54de73217..342b4e6cbb2 100644
--- a/src/server/game/Entities/Player/SceneMgr.cpp
+++ b/src/server/game/Entities/Player/SceneMgr.cpp
@@ -31,6 +31,8 @@ SceneMgr::SceneMgr(Player* player) : _player(player)
_isDebuggingScenes = false;
}
+SceneMgr::~SceneMgr() = default;
+
uint32 SceneMgr::PlayScene(uint32 sceneId, Position const* position /*= nullptr*/)
{
SceneTemplate const* sceneTemplate = sObjectMgr->GetSceneTemplate(sceneId);
@@ -63,8 +65,12 @@ uint32 SceneMgr::PlaySceneByTemplate(SceneTemplate const* sceneTemplate, Positio
playScene.Location = *position;
playScene.TransportGUID = GetPlayer()->GetTransGUID();
playScene.Encrypted = sceneTemplate->Encrypted;
+ playScene.Write();
- GetPlayer()->SendDirectMessage(playScene.Write());
+ if (GetPlayer()->IsInWorld())
+ GetPlayer()->SendDirectMessage(playScene.GetRawPacket());
+ else
+ _delayedScenes.push_back(playScene.Move());
AddInstanceIdToSceneMap(sceneInstanceID, sceneTemplate);
@@ -228,3 +234,11 @@ uint32 SceneMgr::GetActiveSceneCount(uint32 sceneScriptPackageId /*= 0*/)
return activeSceneCount;
}
+
+void SceneMgr::TriggerDelayedScenes()
+{
+ for (WorldPacket& playScene : _delayedScenes)
+ GetPlayer()->SendDirectMessage(&playScene);
+
+ _delayedScenes.clear();
+}
diff --git a/src/server/game/Entities/Player/SceneMgr.h b/src/server/game/Entities/Player/SceneMgr.h
index bfbd0951e02..add721b4931 100644
--- a/src/server/game/Entities/Player/SceneMgr.h
+++ b/src/server/game/Entities/Player/SceneMgr.h
@@ -20,6 +20,7 @@
#include "Common.h"
#include <map>
+#include <vector>
enum SceneFlags
{
@@ -32,6 +33,7 @@ enum SceneFlags
};
class Player;
+class WorldPacket;
struct Position;
struct SceneTemplate;
@@ -41,6 +43,7 @@ class TC_GAME_API SceneMgr
{
public:
SceneMgr(Player* player);
+ ~SceneMgr();
SceneMgr(SceneMgr const&) = delete;
SceneMgr(SceneMgr&&) = delete;
@@ -76,6 +79,8 @@ public:
uint32 GetNewStandaloneSceneInstanceID() { return ++_standaloneSceneInstanceID; }
+ void TriggerDelayedScenes();
+
void ToggleDebugSceneMode() { _isDebuggingScenes = !_isDebuggingScenes; }
bool IsInDebugSceneMode() const { return _isDebuggingScenes; }
@@ -83,6 +88,7 @@ private:
Player* _player;
SceneTemplateByInstance _scenesByInstance;
uint32 _standaloneSceneInstanceID;
+ std::vector<WorldPacket> _delayedScenes;
bool _isDebuggingScenes;
};