diff options
| author | Shauren <shauren.trinity@gmail.com> | 2021-10-05 15:10:33 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-10-05 15:10:33 +0200 |
| commit | 6d93f0a5f79c5465341a850279466ce36232e72e (patch) | |
| tree | b942df2a962d5e2b08e36fafa42107181cdeb1c7 /src | |
| parent | a566b84e6a8602a362528b0deac72b7ff5903c08 (diff) | |
Core/Scenes: Delay scenes sent when not in world until adding to map
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/SceneMgr.cpp | 16 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/SceneMgr.h | 6 |
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; }; |
