Core/Scenes: Delay scenes sent when not in world until adding to map
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user