Core/Scenes: Delay scenes sent when not in world until adding to map

This commit is contained in:
Shauren
2021-10-05 15:10:33 +02:00
parent a566b84e6a
commit 6d93f0a5f7
5 changed files with 33 additions and 9 deletions
+9 -8
View File
@@ -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));
@@ -24377,6 +24377,8 @@ void Player::SendInitialPacketsAfterAddToMap()
else
ClearQuestSharingInfo();
}
GetSceneMgr().TriggerDelayedScenes();
}
void Player::SendUpdateToOutOfRangeGroupMembers()
+1
View File
@@ -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)
{
+15 -1
View File
@@ -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();
}
@@ -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;
};